<?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: Valentin</title>
    <description>The latest articles on DEV Community by Valentin (@oopas).</description>
    <link>https://dev.to/oopas</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%2F553595%2F1f47079b-5d53-459a-8419-b9f866e09895.png</url>
      <title>DEV Community: Valentin</title>
      <link>https://dev.to/oopas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oopas"/>
    <language>en</language>
    <item>
      <title>Cao, take and share easily your toolbox !</title>
      <dc:creator>Valentin</dc:creator>
      <pubDate>Mon, 13 Apr 2026 22:17:41 +0000</pubDate>
      <link>https://dev.to/oopas/cao-take-and-share-easily-your-toolbox--2e7k</link>
      <guid>https://dev.to/oopas/cao-take-and-share-easily-your-toolbox--2e7k</guid>
      <description>&lt;p&gt;I started building &lt;code&gt;cao&lt;/code&gt; to solve a very personal problem.&lt;/p&gt;

&lt;p&gt;Not just “sync my dotfiles”, but rebuild the right local environment on any machine without mixing personal setup, work setup, and sensitive access.&lt;/p&gt;

&lt;p&gt;In practice, my local setup is not only &lt;code&gt;~/.gitconfig&lt;/code&gt; or &lt;code&gt;~/.zshrc&lt;/code&gt;.&lt;br&gt;
It is also kubeconfigs, &lt;code&gt;.env&lt;/code&gt; files, &lt;code&gt;kubectl&lt;/code&gt; wrappers, aliases, small scripts, and config files that need to exist in the right place.&lt;/p&gt;

&lt;p&gt;And I kept running into the same awkward trade-off:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one big repo that mixes everything together,&lt;/li&gt;
&lt;li&gt;bootstrap scripts that drift over time,&lt;/li&gt;
&lt;li&gt;or secrets managed completely separately from the rest of the setup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built &lt;code&gt;cao&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;br&gt;
instead of having one repo or one source of truth for the whole machine, I split my setup into compartmentalized workspaces.&lt;/p&gt;

&lt;p&gt;One &lt;code&gt;personal&lt;/code&gt; workspace.&lt;br&gt;
One &lt;code&gt;work&lt;/code&gt; workspace.&lt;br&gt;
And potentially one workspace per team, client, or project.&lt;/p&gt;

&lt;p&gt;Each workspace can contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;files,&lt;/li&gt;
&lt;li&gt;encrypted secrets,&lt;/li&gt;
&lt;li&gt;locally published commands,&lt;/li&gt;
&lt;li&gt;wrappers and aliases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On a new machine, I clone only the workspaces I want to use, run &lt;code&gt;cao plan&lt;/code&gt;, then &lt;code&gt;cao apply&lt;/code&gt;, and rebuild only the environment I actually need.&lt;/p&gt;

&lt;p&gt;What I like about this approach is that the value is not just multi-device sync.&lt;br&gt;
It is context separation.&lt;/p&gt;

&lt;p&gt;Even inside a team, not everyone needs the same &lt;code&gt;.env&lt;/code&gt;, kubeconfig, or internal commands.&lt;br&gt;
Being able to partition that setup by workspace feels healthier than defaulting to one shared setup for everyone.&lt;/p&gt;

&lt;p&gt;I like tools like &lt;code&gt;chezmoi&lt;/code&gt;, but I was looking for something slightly different.&lt;br&gt;
&lt;code&gt;chezmoi&lt;/code&gt; is great when you want a single source of truth for dotfiles across multiple machines.&lt;br&gt;
With &lt;code&gt;cao&lt;/code&gt;, I wanted to compose local state from smaller clonable workspaces that become active locally, with encrypted secrets living next to the rest of the config.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cao&lt;/code&gt; is not trying to replace IAM or an enterprise secret manager.&lt;br&gt;
The goal is simpler:&lt;br&gt;
make the local state you are already allowed to have portable, reviewable, and reproducible.&lt;/p&gt;

&lt;p&gt;If you already solve this with &lt;code&gt;chezmoi&lt;/code&gt;, &lt;code&gt;nix&lt;/code&gt;, or custom bootstrap scripts, I’d love to compare approaches.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ValentinAUCLERC" rel="noopener noreferrer"&gt;
        ValentinAUCLERC
      &lt;/a&gt; / &lt;a href="https://github.com/ValentinAUCLERC/cao" rel="noopener noreferrer"&gt;
        cao
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Caisse à Outils
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;cao&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;cao&lt;/code&gt; is a workspace-first home-state composer for dotfiles, configs, secrets, and user scripts.&lt;/p&gt;
&lt;p&gt;It helps you build a clean local setup from small, reviewable workspaces instead of one giant machine-specific repo. Put your personal setup in one workspace, your work setup in another, keep secrets encrypted, and let &lt;code&gt;cao&lt;/code&gt; materialize the right files on demand.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why cao&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Workspace-first by design: every workspace present in &lt;code&gt;workspaces/&lt;/code&gt; is active by default.&lt;/li&gt;
&lt;li&gt;Friendly CLI for common cases: add files, secrets, and commands without hand-writing manifests.&lt;/li&gt;
&lt;li&gt;Safe local workflow: &lt;code&gt;plan&lt;/code&gt;, &lt;code&gt;diff&lt;/code&gt;, &lt;code&gt;apply&lt;/code&gt;, and &lt;code&gt;prune&lt;/code&gt; always operate from the workspaces you already have locally.&lt;/li&gt;
&lt;li&gt;Secrets live next to the rest of your setup: use &lt;code&gt;sops&lt;/code&gt; and &lt;code&gt;age&lt;/code&gt; without bolting on a separate system.&lt;/li&gt;
&lt;li&gt;Intentionally strict YAML: unknown fields, anchors, merge keys, and custom tags are rejected to keep things explicit and reviewable.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Homebrew:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;brew install ValentinAUCLERC/tap/cao&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Prebuilt binaries are also…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ValentinAUCLERC/cao" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;DISCLAIMER : This project has been vibecoded. I'm a webdev, i don't know go sadly. But the philosophy and architecture is human !&lt;/p&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How would you do to exchange file through REST API ?</title>
      <dc:creator>Valentin</dc:creator>
      <pubDate>Thu, 26 Sep 2024 10:20:52 +0000</pubDate>
      <link>https://dev.to/oopas/how-would-you-do-to-exchange-file-through-rest-api--2h92</link>
      <guid>https://dev.to/oopas/how-would-you-do-to-exchange-file-through-rest-api--2h92</guid>
      <description>&lt;p&gt;Hey guys ! &lt;/p&gt;

&lt;p&gt;I'm looking for good practice from the community.&lt;/p&gt;

&lt;p&gt;I'm developping a REST API and I sometime need to upload/download files.&lt;br&gt;
What would be the best practice to you ? &lt;/p&gt;

&lt;p&gt;Solution 1 : Sending a link to a ressource accessible publicly and let the client download it ? &lt;/p&gt;

&lt;p&gt;Solution 2 : Send file through base64 value ? &lt;/p&gt;

&lt;p&gt;Solution 3 : ???&lt;/p&gt;

&lt;p&gt;Thank you ! &lt;/p&gt;

</description>
      <category>php</category>
      <category>rest</category>
      <category>api</category>
    </item>
    <item>
      <title>Houston, we've got code quality problem here</title>
      <dc:creator>Valentin</dc:creator>
      <pubDate>Tue, 23 Jan 2024 14:35:35 +0000</pubDate>
      <link>https://dev.to/oopas/houston-weve-got-code-quality-problem-here-501j</link>
      <guid>https://dev.to/oopas/houston-weve-got-code-quality-problem-here-501j</guid>
      <description>&lt;p&gt;Let's say you have a rather old project (about fifteen years old), and a few developers working on it. &lt;/p&gt;

&lt;p&gt;Today, there are no special practices regarding code quality, at least the bare minimum (code review and PR are still in their infancy, no CI/CD etc.).&lt;/p&gt;

&lt;p&gt;This creates technical debt on the one hand, and bugs on the other - in short, a whole host of things that your developers will have to work on rather than features.&lt;/p&gt;

&lt;p&gt;If you're the technical director or project manager on this project, at what point do you say to yourself "wow, this is serious, it's becoming the top priority"? &lt;/p&gt;

&lt;p&gt;Now let's say I've analyzed the last 1500 commits and 45% of them contain the word "fix" or "bug" or something like that.&lt;br&gt;
Mind you, we're also talking about fixes that haven't been reported by users, some of which are proactive (but still went to prod).&lt;br&gt;
Is this normal in some teams? Let's face it, even in companies with extraordinary code quality, we never reach 0% of commits to fix WHAT HAS REACHED PROD (important). I'd really like to know at what point you say to yourself "we've got a code quality problem and we've got to deal with it NOW".&lt;/p&gt;

&lt;p&gt;What metrics do you use to monitor the quality of your code? The % of commits containing "fix" or "bug" well... that's a start but I'd like more tangible things.&lt;/p&gt;

&lt;p&gt;You can guess my side and how it is important to me but... how to convince my boss ? Obviously answer like "as long as there is one bug per year it's the top priority of the whole team to increase code quality", well it won't help, let's stay in real world with real issues :p)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>codequality</category>
      <category>qa</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
