<?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: Julien Mangeard</title>
    <description>The latest articles on DEV Community by Julien Mangeard (@mrflop).</description>
    <link>https://dev.to/mrflop</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%2F3323044%2F137cd283-13c6-46a1-81d3-842a115f82ba.png</url>
      <title>DEV Community: Julien Mangeard</title>
      <link>https://dev.to/mrflop</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mrflop"/>
    <language>en</language>
    <item>
      <title>🔌 Programmable backups are here: Introducing Plakar integrations</title>
      <dc:creator>Julien Mangeard</dc:creator>
      <pubDate>Sun, 20 Jul 2025 16:20:13 +0000</pubDate>
      <link>https://dev.to/mrflop/programmable-backups-are-here-introducing-plakar-integrations-eif</link>
      <guid>https://dev.to/mrflop/programmable-backups-are-here-introducing-plakar-integrations-eif</guid>
      <description>&lt;p&gt;Hey Dev.to 👋&lt;/p&gt;

&lt;p&gt;I’m Julien, co-founder of Plakar, a simple and reliable open-source backup solution. Today we’re excited to introduce our new Go SDK, which makes backups truly programmable—and we think you’re going to love what that unlocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Plakar?
&lt;/h2&gt;

&lt;p&gt;Plakar is an open-source, CLI-first backup and restore tool built on our immutable storage engine, &lt;strong&gt;Kloset&lt;/strong&gt;. It delivers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Military-grade end-to-end encryption&lt;/li&gt;
&lt;li&gt;Content-addressed deduplication&lt;/li&gt;
&lt;li&gt;Compression, immutability and verifiable restores&lt;/li&gt;
&lt;li&gt;Tiny storage and bandwidth overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Engineers love its Unix-style commands and defaults that just work. Check out the repo on GitHub:&lt;br&gt;
👉 &lt;a href="https://github.com/PlakarKorp/plakar" rel="noopener noreferrer"&gt;https://github.com/PlakarKorp/plakar&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  💡 Backups aren’t just insurance anymore
&lt;/h2&gt;

&lt;p&gt;In modern environments, backups need to be part of your stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hook into your CI/CD&lt;/strong&gt;: run application-consistent backups on every deploy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate restores&lt;/strong&gt;: test rollbacks in staging or spin up a disaster-recovery drill&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embed scanners&lt;/strong&gt;: plug in compliance checks or secret detectors right in the backup pipeline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship your own connectors&lt;/strong&gt;: whether it’s a proprietary database or a custom SaaS API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With programmability, your backups become first-class citizens of your infrastructure.&lt;/p&gt;
&lt;h2&gt;
  
  
  🚀 Discover the programmable stack
&lt;/h2&gt;

&lt;p&gt;We shipped a new integration framework in Kloset: any source or destination can now be a connectors bundle in an "integration package". You can consider this framework to backup and restore: databases, SaaS apps, IMAP inboxes, local folders, object/blob storages, APIs data.&lt;/p&gt;

&lt;p&gt;If you can read it, Plakar can protect it.&lt;/p&gt;
&lt;h2&gt;
  
  
  🛠️ Build your custom backup integration with &lt;code&gt;go-kloset-sdk&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Most backup systems don’t even let you write your own connectors or plugins, forcing you to rely on limited built-in options.&lt;/p&gt;

&lt;p&gt;With go-kloset-sdk, you can design, build, and package custom backup components in minutes—no low-level plumbing or protocol handling required.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Implement the Connector Interface
&lt;/h3&gt;

&lt;p&gt;Example: A simple FTP source connector:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewFTPImporter&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="n"&gt;importer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Importer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FTPImporter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;

&lt;span class="c"&gt;// produce the full list of resources to backup&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FTPImporter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Scan&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;lt;-&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;importer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ScanResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;// provide a ReadCloser to a specific ressource &lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;FTPImporter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;NewReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadCloser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s really it. Connect to the resource, expose the data.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Implement the Connector Interface
&lt;/h3&gt;

&lt;p&gt;Second step is to write a &lt;code&gt;main.go&lt;/code&gt; that registers the implementation to the SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"os"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/PlakarKorp/go-kloset-sdk/sdk"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/PlakarKorp/integration-ftp/importer"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Usage: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;sdk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunImporter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;importer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewFTPImporter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&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;h3&gt;
  
  
  3. Describe it in a Manifest
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ftp&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ftp importer&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.1.0&lt;/span&gt;
&lt;span class="na"&gt;connectors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;importer&lt;/span&gt;
  &lt;span class="na"&gt;executable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ftpImporter&lt;/span&gt;
  &lt;span class="na"&gt;homepage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/PlakarKorp/integration-ftp&lt;/span&gt;
  &lt;span class="na"&gt;license&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ISC&lt;/span&gt;
  &lt;span class="na"&gt;protocols&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;ftp&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Build the Package
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ go build -o ftpImporter ./plugin/importer
$ plakar pkg create manifest.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll get a &lt;code&gt;ftp-v0.1.0.ptar&lt;/code&gt; you can install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ plakar pkg add ftp-v0.1.0.ptar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And voilà — &lt;code&gt;ftp://&lt;/code&gt; becomes a fully-supported import source in your setup.&lt;/p&gt;

&lt;p&gt;Explore the SDK and examples:&lt;br&gt;
👉 &lt;a href="https://github.com/PlakarKorp/go-kloset-sdk" rel="noopener noreferrer"&gt;https://github.com/PlakarKorp/go-kloset-sdk&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  👷‍♀️ For SREs: integrate missing stack elements
&lt;/h2&gt;

&lt;p&gt;Is there a piece of your infrastructure that lacks a backup story? Maybe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A legacy CRM with only ad-hoc exports&lt;/li&gt;
&lt;li&gt;A proprietary message queue without snapshot support&lt;/li&gt;
&lt;li&gt;A home-grown secrets vault&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With a few lines of Go you can bridge it into Plakar’s snapshot engine.&lt;/p&gt;

&lt;p&gt;Then your SRE runbooks can include native &lt;code&gt;plakar backup&lt;/code&gt; &lt;code&gt;plakar restore&lt;/code&gt; steps—no glue scripts, no brittle ad-hoc tooling.&lt;/p&gt;
&lt;h2&gt;
  
  
  🔐 Your data inherits Kloset’s guarantees
&lt;/h2&gt;

&lt;p&gt;Once your plugin feeds data into Plakar, you instantly get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immutable, content-addressed storage&lt;/li&gt;
&lt;li&gt;Built-in encryption and compression&lt;/li&gt;
&lt;li&gt;Verifiable restore process (tamper-evident digests)&lt;/li&gt;
&lt;li&gt;Portability across clouds, data centers and air-gapped vaults&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you’re snapshotting database dumps, pulling API payloads, or archiving complex object graphs, it all benefits from one battle-tested storage layer.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧪 Try it now (early access)
&lt;/h2&gt;

&lt;p&gt;Grab our latest development build and dive in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/PlakarKorp/plakar@v1.0.3-devel.455ca52
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check out the code, browse our docs and sample integrations on GitHub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plakar core&lt;/strong&gt;: &lt;a href="https://github.com/PlakarKorp/plakar" rel="noopener noreferrer"&gt;https://github.com/PlakarKorp/plakar&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;go-kloset-sdk&lt;/strong&gt;: &lt;a href="https://github.com/PlakarKorp/go-kloset-sdk" rel="noopener noreferrer"&gt;https://github.com/PlakarKorp/go-kloset-sdk&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll be publishing more examples this week—think API-based importers, advanced snapshot transformers and beyond.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬 Your turn: what will you back up?
&lt;/h2&gt;

&lt;p&gt;We’re building this for engineers and SREs who want more from backups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which app in your stack still needs a proper backup solution?&lt;/li&gt;
&lt;li&gt;What service forces you to write fragile glue code just to capture state?&lt;/li&gt;
&lt;li&gt;What would you love to snapshot and restore as easily as a folder?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop a comment below, open an issue on GitHub or join our Discord to share ideas, contribute your own integrations, or help shape the future of programmable backups.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

&lt;p&gt;— The Plakar team&lt;/p&gt;

</description>
      <category>backup</category>
      <category>devops</category>
      <category>cicd</category>
    </item>
  </channel>
</rss>
