<?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>Forem: Zak R.</title>
    <description>The latest articles on Forem by Zak R. (@zakpie).</description>
    <link>https://forem.com/zakpie</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%2F555732%2F22c39793-c0c1-474b-a7d5-ac252f757924.png</url>
      <title>Forem: Zak R.</title>
      <link>https://forem.com/zakpie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/zakpie"/>
    <language>en</language>
    <item>
      <title>Why I Stopped Using PM2 and Built My Own Bun Process Manager</title>
      <dc:creator>Zak R.</dc:creator>
      <pubDate>Thu, 12 Feb 2026 15:11:08 +0000</pubDate>
      <link>https://forem.com/zakpie/why-i-stopped-using-pm2-and-built-my-own-bun-process-manager-4ehe</link>
      <guid>https://forem.com/zakpie/why-i-stopped-using-pm2-and-built-my-own-bun-process-manager-4ehe</guid>
      <description>&lt;p&gt;&lt;strong&gt;I loved PM2. Then I switched to Bun.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me tell you a quick story. Six months ago, I migrated a handful of microservices from Node to Bun. The speed improvements were everything the benchmarks promised. Cold starts dropped dramatically. Memory usage shrank. I was thrilled.&lt;/p&gt;

&lt;p&gt;Then I noticed something. My process manager, PM2, the tool I'd relied on for years, was now the slowest part of my stack. It was the thing consuming the most memory in some cases. The irony of running a Node-based supervisor over hyper-optimized Bun processes started to eat at me.&lt;/p&gt;

&lt;p&gt;So I did what any reasonable developer does. I spent my weekends building a replacement.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Breaking Point
&lt;/h2&gt;

&lt;p&gt;The final straw wasn't one big thing. It was a cascade of small frustrations. PM2 would occasionally misreport memory usage for Bun processes. The TypeScript integration required extra flags and workarounds. &lt;/p&gt;

&lt;p&gt;I had to maintain a separate ecosystem.json that felt increasingly disconnected from the rest of my Bun-native tooling. Every time I ran &lt;strong&gt;pm2 start&lt;/strong&gt;, there was a visible delay as the Node-based daemon spun up, only to then launch a Bun process.&lt;/p&gt;

&lt;p&gt;I started keeping a list of these friction points. After a few weeks, the list was long enough to justify a project.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;BM2 is a process manager that does one thing: manage long-running Bun processes without any Node dependency. &lt;/p&gt;

&lt;p&gt;No daemon running on a separate runtime. No compatibility layers. Just Bun managing Bun.&lt;/p&gt;

&lt;p&gt;The CLI is deliberately familiar:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm i -g bm2&lt;br&gt;
bm2 start server.ts --name api&lt;br&gt;
bm2 restart api&lt;br&gt;
bm2 logs api --lines 100&lt;br&gt;
bm2 list&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Under the hood, everything uses Bun's native APIs. Subprocess spawning uses Bun.spawn. File operations use Bun.write and Bun.file. &lt;/p&gt;

&lt;p&gt;The internal state management uses Bun's built-in SQLite. No fs polyfills. No child_process from Node. Pure Bun.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;p&gt;After migrating my services from PM2 to BM2, here's what I noticed.&lt;br&gt;
The process manager itself starts almost instantly. &lt;/p&gt;

&lt;p&gt;There's no daemon boot delay. The memory overhead of the manager dropped significantly because it's not running a full Node runtime alongside Bun. &lt;/p&gt;

&lt;p&gt;TypeScript files just work — no flags, no config, no transpilation. And the whole thing feels coherent in a way that's hard to describe. My entire stack is one runtime now, top to bottom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should You Switch?
&lt;/h2&gt;

&lt;p&gt;If you're running Node services, PM2 is still excellent. Seriously. It's mature, battle-tested, and feature-rich.&lt;/p&gt;

&lt;p&gt;But if you've committed to Bun, consider whether your toolchain has actually caught up with that decision. Your runtime is Bun. Your package manager is Bun. Your test runner is Bun. Why is your process manager still Node?&lt;/p&gt;

&lt;p&gt;That's the question that led me to build BM2. Maybe it's the question you've been ignoring too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;br&gt;
Repository: &lt;a href="https://github.com/bun-bm2/bm2" rel="noopener noreferrer"&gt;https://github.com/bun-bm2/bm2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Package: &lt;a href="https://www.npmjs.com/package/bm2" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/bm2&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bunjs</category>
      <category>pm2</category>
      <category>node</category>
    </item>
    <item>
      <title>Deploying Solana Anchor Programs Easily with Rocket Anchor</title>
      <dc:creator>Zak R.</dc:creator>
      <pubDate>Mon, 10 Nov 2025 23:50:06 +0000</pubDate>
      <link>https://forem.com/zakpie/deploying-solana-anchor-programs-easily-with-rocket-anchor-48jf</link>
      <guid>https://forem.com/zakpie/deploying-solana-anchor-programs-easily-with-rocket-anchor-48jf</guid>
      <description>&lt;p&gt;If you're a developer working with Anchor on Solana, you know the drill. You build your powerful program, and then... you're stuck writing a tangled mess of ad-hoc scripts for deployment, upgrades, and account initialization. It's time-consuming, error-prone, and just plain frustrating.&lt;/p&gt;

&lt;p&gt;What if you could have a smooth, repeatable, Hardhat-style workflow?&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/rocket-anchor" rel="noopener noreferrer"&gt;Rocket Anchor&lt;/a&gt;&lt;/strong&gt;, a new open-source tool designed to save you from deployment headaches and streamline your entire process. This guide will walk you through exactly what it is and how to get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Rocket Anchor?
&lt;/h2&gt;

&lt;p&gt;Rocket Anchor is a CLI and programmatic tool that brings the developer-friendly experience of tools like Hardhat to the Anchor ecosystem.&lt;/p&gt;

&lt;p&gt;Its main goal is to solve the "last mile" problem of Anchor development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It replaces manual scripts&lt;/strong&gt; with a clean, config-based CLI workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It introduces "seeding,"&lt;/strong&gt; a powerful concept for initializing accounts, PDAs, and program state right after deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's built for teams,&lt;/strong&gt; making it easy to manage deployments across different networks (&lt;code&gt;devnet&lt;/code&gt;, &lt;code&gt;mainnet&lt;/code&gt;) without changing your code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardhat-Inspired CLI:&lt;/strong&gt; Get a familiar workflow with commands like &lt;code&gt;init&lt;/code&gt;, &lt;code&gt;deploy&lt;/code&gt;, and &lt;code&gt;seed&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Powerful Seeding:&lt;/strong&gt; Run scripts &lt;em&gt;after&lt;/em&gt; deployment to initialize program state, create PDAs, or set up initial data. This is a massive time-saver.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Management:&lt;/strong&gt; Easily configure different networks (like &lt;code&gt;devnet&lt;/code&gt;, &lt;code&gt;testnet&lt;/code&gt;, &lt;code&gt;mainnet&lt;/code&gt;, &lt;code&gt;custom-network&lt;/code&gt;) in a single config file, complete with RPC endpoints and keypair paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Programmatic API:&lt;/strong&gt; Need to integrate Rocket Anchor into your existing TypeScript toolchain? You can import and use it directly.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;You can install Rocket Anchor globally to use it as a CLI tool across all your projects, or locally as a &lt;code&gt;devDependency&lt;/code&gt; in a specific project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Global Install:&lt;/strong&gt;&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; rocket-anchor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Local Install:&lt;/strong&gt;&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;--save-dev&lt;/span&gt; rocket-anchor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Getting Started: Your First Deployment
&lt;/h2&gt;

&lt;p&gt;Let's walk through the entire workflow from zero to a seeded deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Initialize Rocket Anchor
&lt;/h3&gt;

&lt;p&gt;In the root of your Anchor project, run the &lt;code&gt;init&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx ra init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a new file named &lt;code&gt;ra.config.ts&lt;/code&gt; in your project's root. This is where you'll define all your networks and deployment configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Configure Your Networks
&lt;/h3&gt;

&lt;p&gt;Open the newly created &lt;code&gt;ra.config.ts&lt;/code&gt;. This is where you'll tell Rocket Anchor how to connect to different Solana clusters.&lt;/p&gt;

&lt;p&gt;A typical configuration might look something like this:&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="c1"&gt;// ra.config.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RocketAnchorConfig&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;rocket-anchor&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;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RocketAnchorConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Local validator&lt;/span&gt;
    &lt;span class="na"&gt;localnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[http://127.0.0.1:8899](http://127.0.0.1:8899)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;keypair&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/path/to/your/localnet/keypair.json&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="c1"&gt;// Devnet&lt;/span&gt;
    &lt;span class="na"&gt;devnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[https://api.devnet.solana.com](https://api.devnet.solana.com)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;keypair&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/path/to/your/devnet/keypair.json&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="c1"&gt;// Mainnet&lt;/span&gt;
    &lt;span class="na"&gt;mainnet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[https://api.mainnet-beta.solana.com](https://api.mainnet-beta.solana.com)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;keypair&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/path/to/your/mainnet/keypair.json&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;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: (Optional but Recommended) Create Seed Scripts
&lt;/h3&gt;

&lt;p&gt;This is where the magic happens. "Seeding" is the process of initializing your program's state right after deployment.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;seeds/&lt;/code&gt; directory and an &lt;code&gt;index.ts&lt;/code&gt; file inside it (&lt;code&gt;seeds/index.ts&lt;/code&gt;). Here, you'll define a &lt;code&gt;SeedConfig&lt;/code&gt; array.&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="c1"&gt;// seeds/index.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SeedConfig&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;rocket-anchor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;seeds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SeedConfig&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="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;program&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// a name for your program&lt;/span&gt;
    &lt;span class="na"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;initialize&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pda:counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;authority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;signer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;systemProgram&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;systemProgram&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="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&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="c1"&gt;// initial_count&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;seeds&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;function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;increment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pda:counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;authority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;signer&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="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="na"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Run 5 times&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;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;seeds&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Deploy and Seed!
&lt;/h3&gt;

&lt;p&gt;You're all set. Now, to deploy your program to &lt;code&gt;devnet&lt;/code&gt; and run the seed scripts immediately after, you just run one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx ra deploy &lt;span class="nt"&gt;--network&lt;/span&gt; devnet &lt;span class="nt"&gt;--seed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rocket Anchor will handle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Connecting to the correct network (&lt;code&gt;devnet&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; Using the correct keypair.&lt;/li&gt;
&lt;li&gt; Deploying your Anchor program.&lt;/li&gt;
&lt;li&gt; Once deployed, it will run the seed scripts you defined for that program.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You're live! No more manual &lt;code&gt;solana program deploy&lt;/code&gt; commands or separate &lt;code&gt;initialize.ts&lt;/code&gt; scripts to run.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Rocket Anchor fills a much-needed gap in the Solana development workflow. By adopting a config-based and scriptable approach to deployments and seeding, it saves time, reduces errors, and lets you focus on what matters: building your program's logic.&lt;/p&gt;

&lt;p&gt;Always remember to test thoroughly on &lt;code&gt;devnet&lt;/code&gt; before deploying to &lt;code&gt;mainnet&lt;/code&gt;. Happy building!&lt;/p&gt;

</description>
      <category>solana</category>
      <category>web3</category>
      <category>smartcontract</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Introducing Truffle Solidity Data Seeder</title>
      <dc:creator>Zak R.</dc:creator>
      <pubDate>Tue, 27 Apr 2021 02:17:12 +0000</pubDate>
      <link>https://forem.com/zakpie/introducing-truffle-solidity-data-seeder-peg</link>
      <guid>https://forem.com/zakpie/introducing-truffle-solidity-data-seeder-peg</guid>
      <description>&lt;p&gt;The Truffle framework is an awesome toolkit for every solidity and dapp developer, we at &lt;a href="https://libertypie.com"&gt;LibertyPie&lt;/a&gt; make advanced use of the truffle framework.&lt;br&gt;&lt;br&gt;
During &lt;a href="https://github.com/LibertyPie/libertypie-p2p"&gt;LibertyPie's P2P&lt;/a&gt; protocol development, we needed a simple way to seed initial data to different contracts similar to database seeding. &lt;br&gt;&lt;br&gt;
Truffle has great migration support but no seeding of data out of the box.&lt;br&gt;&lt;br&gt;
So we decided to build a simple CLI tool as an npm package for seeding initial data out of the box with 0 configurations.   &lt;br&gt;&lt;/p&gt;

&lt;p&gt;Introducing &lt;a href="https://github.com/LibertyPie/truffle-seeder"&gt;Liberty Pie's Truffle Seeder&lt;/a&gt;, your easy way to seed initial data to any smart contract. Kindly help us improve it by giving us your feedback&lt;/p&gt;

&lt;p&gt;Project: &lt;a href="https://github.com/LibertyPie/truffle-seeder"&gt;https://github.com/LibertyPie/truffle-seeder&lt;/a&gt;&lt;/p&gt;

</description>
      <category>etheruem</category>
      <category>javascript</category>
      <category>blockchain</category>
      <category>truffleframework</category>
    </item>
    <item>
      <title>Introducing LibertyPie’s Wallet Provider</title>
      <dc:creator>Zak R.</dc:creator>
      <pubDate>Thu, 07 Jan 2021 23:58:17 +0000</pubDate>
      <link>https://forem.com/zakpie/introducing-libertypie-s-wallet-provider-17h0</link>
      <guid>https://forem.com/zakpie/introducing-libertypie-s-wallet-provider-17h0</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UAilS8n4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rvhixu82hskx1uqpuywd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UAilS8n4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/rvhixu82hskx1uqpuywd.png" alt="LibertyPie WalletProvider Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As the team builds the protocol’s user interface, it is very important to research deeply into which external libraries to include. The user interface must have a rich user experience &amp;amp; also very light weighted.&lt;/p&gt;

&lt;p&gt;Every DApp must find a way to connect to users’ wallet without compromising privacy and security. Fortunately, we found many matured and well-developed libraries such as web3modal (previously web3connect), web3-wallets-kit (by Akropolis), bnc-onboard (by BlockNative) &amp;amp; many more.&lt;/p&gt;

&lt;p&gt;After a careful analysis of these existing solutions, we found reasons which discouraged us from using them. A major reason was the bloat in library size, other reasons included an incomplete library or having to pay for usage in the case of BloackNative bnc-onboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A-ytLQLm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/98fkuqhj29hg3iccwjl8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A-ytLQLm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/98fkuqhj29hg3iccwjl8.jpeg" alt="WalletProvider Image 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our final resort was to build a library exactly how we wanted it, thankfully, the initial version of LibertyPie Wallet Provider is successfully published on npm (&lt;a href="https://www.npmjs.com/package/@libertypie/wallet-provider"&gt;https://www.npmjs.com/package/@libertypie/wallet-provider&lt;/a&gt;).&lt;br&gt;
LibertyPie Wallet Provider was built to provide extra advantages over other libraries, a detailed comparison has been given below.&lt;/p&gt;

&lt;h4&gt;
  
  
  Size (according to Bundlephobia.com)
&lt;/h4&gt;

&lt;p&gt;LibertyPie Wallet Provider — 6.9kb minified +gzipped&lt;br&gt;
Web3Modal — 195kb minified + gzipped&lt;br&gt;
bnc-onboard — 65.1kb minified + gzipped&lt;br&gt;
web3-wallets-kit — 784.4kb minified + gzipped&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Best&lt;/em&gt;: LibertyPie Wallet Provider&lt;br&gt;
&lt;em&gt;Worst&lt;/em&gt;: web3-wallets-kit&lt;/p&gt;

&lt;h4&gt;
  
  
  Runtime Dependencies
&lt;/h4&gt;

&lt;p&gt;LibertyPie Wallet Provider— 0&lt;br&gt;
Web3Modal — 6&lt;br&gt;
bnc-onboard — 20&lt;br&gt;
web3-wallets-kit — 9&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Best:&lt;/em&gt; LibertyPie Wallet Provider&lt;br&gt;
&lt;em&gt;Worst:&lt;/em&gt; bnc-onboard&lt;/p&gt;

&lt;h4&gt;
  
  
  Supported Wallets Providers
&lt;/h4&gt;

&lt;p&gt;LibertyPie Wallet Provider — 9&lt;br&gt;
Web3Modal — 11&lt;br&gt;
bnc-onboard — 6&lt;br&gt;
web3-wallets-kit — N/A&lt;/p&gt;

&lt;p&gt;As seen from the data above, LibertyPie Wallet Provider has many merits compared to the other libraries.&lt;br&gt;
NPM: &lt;a href="https://www.npmjs.com/package/@libertypie/wallet-provider"&gt;https://www.npmjs.com/package/@libertypie/wallet-provider&lt;/a&gt;&lt;br&gt;
Github Repo: &lt;a href="https://github.com/LibertyPie/Wallet-Provider"&gt;https://github.com/LibertyPie/Wallet-Provider&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
