<?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: Florian</title>
    <description>The latest articles on DEV Community by Florian (@flo0806).</description>
    <link>https://dev.to/flo0806</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%2F3255023%2Fbe2b51b1-86b6-4617-b555-ac086c0318ee.jpeg</url>
      <title>DEV Community: Florian</title>
      <link>https://dev.to/flo0806</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/flo0806"/>
    <language>en</language>
    <item>
      <title>What Really Belongs in a Git Repository? (Asking for a Friend)</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Fri, 13 Jun 2025 15:49:59 +0000</pubDate>
      <link>https://dev.to/flo0806/what-really-belongs-in-a-git-repository-asking-for-a-friend-2795</link>
      <guid>https://dev.to/flo0806/what-really-belongs-in-a-git-repository-asking-for-a-friend-2795</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2F4qb4rz4rwubd0jfbz6r8.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.amazonaws.com%2Fuploads%2Farticles%2F4qb4rz4rwubd0jfbz6r8.png" alt="GIT" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’d think by now we’d all agree on what goes into a Git repository. But alas — I still get pull requests containing &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;.p12&lt;/code&gt;, and even &lt;code&gt;node_modules&lt;/code&gt;. So let’s settle this like adults (with a healthy dose of sarcasm and too much coffee).&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 Self-Signed Certificates
&lt;/h2&gt;

&lt;p&gt;Ah yes, the good old &lt;code&gt;cert.pem&lt;/code&gt;. Nothing screams "I'm new here" like committing private keys to a public repo.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule of thumb:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If it can be used to impersonate your server, decrypt traffic, or ruin your weekend — &lt;strong&gt;don’t commit it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exception:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you’re building a &lt;em&gt;fully fake&lt;/em&gt; local environment and your &lt;code&gt;cert.pem&lt;/code&gt; is &lt;em&gt;literally&lt;/em&gt; useless outside of localhost:3000, fine. But at least &lt;code&gt;.gitignore&lt;/code&gt; the real ones.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 &lt;code&gt;.env&lt;/code&gt; Files
&lt;/h2&gt;

&lt;p&gt;Your &lt;code&gt;.env&lt;/code&gt; file is like your toothbrush. Vital, personal, and not something you share with the internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yes, I know:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
“&lt;em&gt;But it’s just the development config!&lt;/em&gt;”&lt;br&gt;&lt;br&gt;
Cool. Then use &lt;code&gt;.env.example&lt;/code&gt;, strip out the secrets, and let your teammates fill in the blanks like grown-ups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exception:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Some people commit &lt;code&gt;.env&lt;/code&gt; files with public/default values (e.g., &lt;code&gt;PORT=3000&lt;/code&gt;). That's okay-ish — if you enjoy living on the edge. Just don’t cry when your database password ends up on GitHub’s trending page.&lt;/p&gt;




&lt;h2&gt;
  
  
  📁 &lt;code&gt;node_modules&lt;/code&gt;, &lt;code&gt;vendor&lt;/code&gt;, and other sins
&lt;/h2&gt;

&lt;p&gt;This isn’t 2005. We have package managers now.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Don’t commit your dependencies.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exception:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you’re on a remote island with no internet and you're building a Docker image that needs offline builds. Even then, maybe ask yourself: &lt;em&gt;Should I even be coding right now?&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Build Artifacts
&lt;/h2&gt;

&lt;p&gt;Dist folders. Compiled binaries. Webpack outputs. You name it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don’t. Do. It.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Unless you're managing a release branch &lt;em&gt;explicitly&lt;/em&gt; for deployment or versioning static artifacts.&lt;/p&gt;

&lt;p&gt;Even then:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tag your releases.
&lt;/li&gt;
&lt;li&gt;Upload the assets &lt;em&gt;elsewhere&lt;/em&gt;.
&lt;/li&gt;
&lt;li&gt;Sleep better at night.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ What &lt;em&gt;Should&lt;/em&gt; Be in Git?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Your source code (yep).
&lt;/li&gt;
&lt;li&gt;Configuration &lt;em&gt;templates&lt;/em&gt;.
&lt;/li&gt;
&lt;li&gt;Docs. Real ones. Not just &lt;code&gt;README.md&lt;/code&gt; with &lt;code&gt;TODO&lt;/code&gt; in it.
&lt;/li&gt;
&lt;li&gt;Infrastructure as Code (Terraform, Dockerfiles, etc.)
&lt;/li&gt;
&lt;li&gt;Tests. (You do write tests, right?)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧹 Also, don’t forget these...
&lt;/h2&gt;

&lt;p&gt;Some files aren’t as obvious — but still don’t belong in your Git history unless you enjoy shame-based learning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System/IDE configs&lt;/strong&gt;: &lt;code&gt;.DS_Store&lt;/code&gt;, &lt;code&gt;Thumbs.db&lt;/code&gt;, &lt;code&gt;.vscode/&lt;/code&gt;, &lt;code&gt;.idea/&lt;/code&gt;, &lt;code&gt;.swp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local-only settings&lt;/strong&gt;: &lt;code&gt;.env.local&lt;/code&gt;, &lt;code&gt;.eslintcache&lt;/code&gt;, &lt;code&gt;.npmrc&lt;/code&gt;, &lt;code&gt;.bash_history&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log &amp;amp; debug output&lt;/strong&gt;: &lt;code&gt;debug.log&lt;/code&gt;, &lt;code&gt;*.log&lt;/code&gt;, &lt;code&gt;npm-debug.log&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database dumps&lt;/strong&gt;: &lt;code&gt;dump.sql&lt;/code&gt;, &lt;code&gt;*.sqlite&lt;/code&gt;, &lt;code&gt;backup.db&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They may seem harmless — until they become evidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;If it's secret, generated, or weighs more than your project — &lt;strong&gt;don't commit it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your Git repo isn’t a trash bin or a backup drive. It's a versioned source of truth, not a confession booth for every debug print and API key you've ever written.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat it with respect, and it'll return the favor.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
(Unless you rebase force-push on &lt;code&gt;main&lt;/code&gt;, in which case: good luck.)&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;P.S.:&lt;/strong&gt; If you're working with Vue 3 and want your forms to behave better than your coworkers’ Git hygiene, check out &lt;a href="https://github.com/flo0806/vorm" rel="noopener noreferrer"&gt;Vorm&lt;/a&gt; — a form engine that actually makes sense.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>git</category>
      <category>vue</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Why I built Vorm – a schema-based form engine for Vue 3 that doesn’t get in your way</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Tue, 10 Jun 2025 08:17:53 +0000</pubDate>
      <link>https://dev.to/flo0806/why-i-built-vorm-a-schema-based-form-engine-for-vue-3-that-doesnt-get-in-your-way-3564</link>
      <guid>https://dev.to/flo0806/why-i-built-vorm-a-schema-based-form-engine-for-vue-3-that-doesnt-get-in-your-way-3564</guid>
      <description>&lt;p&gt;Forms.&lt;br&gt;&lt;br&gt;
They’re everywhere.&lt;br&gt;&lt;br&gt;
Even when typing a URL, technically, you’re already interacting with one.&lt;br&gt;&lt;br&gt;
But let’s not get dramatic. 😄&lt;/p&gt;

&lt;p&gt;Still, on nearly every site, every web app, we deal with forms in one way or another.&lt;br&gt;&lt;br&gt;
Login screens. Registration. Profile settings. Blog editors. Ordering a pizza.&lt;br&gt;&lt;br&gt;
Forms are not the enemy.&lt;/p&gt;

&lt;p&gt;But something changed for me when I had to work on a &lt;em&gt;massive&lt;/em&gt; form with over &lt;strong&gt;120 fields&lt;/strong&gt;, many of which were conditionally shown or enabled depending on other values:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If &lt;code&gt;select A&lt;/code&gt; has value &lt;code&gt;X&lt;/code&gt;, then &lt;code&gt;select B&lt;/code&gt; must be &lt;code&gt;Y&lt;/code&gt;, and &lt;code&gt;input Z&lt;/code&gt; disappears."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It was &lt;strong&gt;thousands of lines of code&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Not elegant. Not maintainable.&lt;br&gt;&lt;br&gt;
Just glue code to bind state, validation, conditional rendering, wrappers, etc.&lt;/p&gt;

&lt;p&gt;At that point I asked myself:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Why do we keep doing this over and over again?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why do I have to handcraft even the simplest login form or settings page from scratch —&lt;br&gt;&lt;br&gt;
or adopt a huge validation framework just to validate a checkbox?&lt;/p&gt;

&lt;p&gt;Most forms are not special.&lt;br&gt;&lt;br&gt;
They follow simple patterns.&lt;br&gt;&lt;br&gt;
I realized: &lt;strong&gt;90% of forms could be auto-generated&lt;/strong&gt;, if we just had a tool that stays out of your way.&lt;/p&gt;

&lt;p&gt;So I decided to build one.&lt;/p&gt;


&lt;h2&gt;
  
  
  I like schemas. I like types. I like simplicity.
&lt;/h2&gt;

&lt;p&gt;And that’s what Vorm is built on.&lt;/p&gt;

&lt;p&gt;At its heart is a &lt;strong&gt;reusable schema&lt;/strong&gt; that defines everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fields&lt;/li&gt;
&lt;li&gt;layout&lt;/li&gt;
&lt;li&gt;validation&lt;/li&gt;
&lt;li&gt;conditional logic&lt;/li&gt;
&lt;li&gt;even styling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You define the schema once.&lt;br&gt;&lt;br&gt;
Then drop in a component like &lt;code&gt;&amp;lt;AutoVorm /&amp;gt;&lt;/code&gt;, maybe pass in a few props – and you're done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No input spamming. No boilerplate. No magic.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Just clean, explicit structure.&lt;/p&gt;

&lt;p&gt;But that wasn’t enough.&lt;br&gt;&lt;br&gt;
Vorm had to be flexible too. Because when the 90% doesn’t cut it —&lt;br&gt;&lt;br&gt;
you still need &lt;strong&gt;100% control&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And so that’s how Vorm works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;AutoVorm&lt;/code&gt; for fast results.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;useVorm()&lt;/code&gt; when you need full programmatic control.&lt;/li&gt;
&lt;li&gt;Use wrappers, slots and your own components to style anything.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  What Vorm became
&lt;/h2&gt;

&lt;p&gt;A single schema — used everywhere.&lt;br&gt;&lt;br&gt;
Want to hide a field? &lt;code&gt;showIf&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Want to change the wrapper component? Use the &lt;code&gt;wrapper&lt;/code&gt; slot.&lt;br&gt;&lt;br&gt;
Want to inject your own field renderer? Go ahead.&lt;/p&gt;

&lt;p&gt;And most importantly:&lt;br&gt;
You always have &lt;strong&gt;full access to the reactive form data and validation state&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is a short example:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Define your scheme in &lt;code&gt;script&lt;/code&gt;&lt;/em&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;VormSchema&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Username&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;validation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;required&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Email address&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;validation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;required&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;rule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;validation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;required&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;notes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Notes&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;textarea&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;role&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Role&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;select&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;validation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;required&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;adminCode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Admin code&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;showIf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Admin&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Accept terms&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;checkbox&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;validation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;required&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;And then all you have to do is this:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;VormSection&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Basic Example"&lt;/span&gt; &lt;span class="na"&gt;titleClasses=&lt;/span&gt;&lt;span class="s"&gt;"text-xl font-bold"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;AutoVorm&lt;/span&gt; &lt;span class="na"&gt;layout=&lt;/span&gt;&lt;span class="s"&gt;"grid"&lt;/span&gt; &lt;span class="na"&gt;:columns=&lt;/span&gt;&lt;span class="s"&gt;"2"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/VormSection&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;To get this:&lt;/em&gt;&lt;/p&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.amazonaws.com%2Fuploads%2Farticles%2Fdi7ukcuj136o1h5wfbht.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.amazonaws.com%2Fuploads%2Farticles%2Fdi7ukcuj136o1h5wfbht.png" alt="Vorm result" width="477" height="423"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What happened to the 120-field beast?
&lt;/h2&gt;

&lt;p&gt;I rebuilt that monstrous form in a separate project using Vorm.&lt;br&gt;&lt;br&gt;
It took some time — and honestly, it &lt;strong&gt;broke Vorm a few times&lt;/strong&gt;. 😅&lt;/p&gt;

&lt;p&gt;But that’s when Vorm started becoming real.&lt;br&gt;&lt;br&gt;
I moved all the logic into the schema. The template shrunk down to maybe &lt;strong&gt;30–40 lines&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And the performance?&lt;br&gt;&lt;br&gt;
All 120 fields, fully validated, in under &lt;strong&gt;20ms&lt;/strong&gt; on cold start.&lt;br&gt;&lt;br&gt;
No debounce hacks. No suspense loading. Just solid reactive performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  So… just another form library?
&lt;/h2&gt;

&lt;p&gt;No. Or, yes — but one that does it differently.&lt;/p&gt;

&lt;p&gt;Yes, Vorm is "another" form engine.&lt;br&gt;&lt;br&gt;
But it’s one that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;doesn’t force you into rigid components,&lt;/li&gt;
&lt;li&gt;doesn’t ship with opinionated styling,&lt;/li&gt;
&lt;li&gt;doesn’t rely on global mixins or massive plugins.&lt;/li&gt;
&lt;li&gt;has only 51kB package size and uses "no" other dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not perfect.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The schema is strongly typed, but can be better.&lt;/li&gt;
&lt;li&gt;File inputs aren’t natively supported yet (though you can easily render them via slots or wrappers).&lt;/li&gt;
&lt;li&gt;It’s still &lt;strong&gt;very young&lt;/strong&gt; — but very alive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s why Vorm is currently in &lt;strong&gt;Alpha&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not ready for your enterprise CRM.&lt;br&gt;&lt;br&gt;
But absolutely ready for small projects, experiments, side apps — and community feedback.&lt;/p&gt;




&lt;h2&gt;
  
  
  I want your thoughts
&lt;/h2&gt;

&lt;p&gt;If you’ve ever written a form and thought  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Why am I still manually doing this?”&lt;br&gt;&lt;br&gt;
Then Vorm might be worth a look.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Try it.&lt;br&gt;&lt;br&gt;
Break it.&lt;br&gt;&lt;br&gt;
Tell me what doesn’t work.&lt;br&gt;&lt;br&gt;
Let’s shape this thing &lt;strong&gt;together&lt;/strong&gt;, before it hits &lt;code&gt;v1.0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;🧪 GitHub: &lt;a href="https://github.com/Flo0806/vorm" rel="noopener noreferrer"&gt;https://github.com/Flo0806/vorm&lt;/a&gt;&lt;br&gt;&lt;br&gt;
📘 Docs: &lt;a href="https://vorm.fh-softdev.de" rel="noopener noreferrer"&gt;https://vorm.fh-softdev.de&lt;/a&gt;&lt;br&gt;&lt;br&gt;
🎮 Playground: &lt;a href="https://stackblitz.com/edit/vitejs-vite-vexqxvur" rel="noopener noreferrer"&gt;Basic Example&lt;/a&gt; &lt;a href="https://stackblitz.com/edit/vitejs-vite-pdfe4po5" rel="noopener noreferrer"&gt;Real-World Example&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Thanks for reading — and if this resonated with you, feel free to ⭐️ it or leave a comment.&lt;br&gt;&lt;br&gt;
Let’s make forms fun again. 🚀&lt;/p&gt;

</description>
      <category>programming</category>
      <category>vue</category>
      <category>javascriptlibraries</category>
      <category>npm</category>
    </item>
  </channel>
</rss>
