<?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: Daffa Izzuddin</title>
    <description>The latest articles on DEV Community by Daffa Izzuddin (@izzudd).</description>
    <link>https://dev.to/izzudd</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1017312%2F98d9ef56-0574-4f30-84cb-217eb703ba9b.png</url>
      <title>DEV Community: Daffa Izzuddin</title>
      <link>https://dev.to/izzudd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/izzudd"/>
    <language>en</language>
    <item>
      <title>I picked frameworks to look different, it took me years to notice</title>
      <dc:creator>Daffa Izzuddin</dc:creator>
      <pubDate>Fri, 30 Oct 2026 14:36:50 +0000</pubDate>
      <link>https://dev.to/izzudd/i-picked-frameworks-to-look-different-it-took-me-years-to-notice-1f0o</link>
      <guid>https://dev.to/izzudd/i-picked-frameworks-to-look-different-it-took-me-years-to-notice-1f0o</guid>
      <description>&lt;p&gt;I write about programming at &lt;a href="https://invasikode.com" rel="noopener noreferrer"&gt;invasikode.com&lt;/a&gt;, and I have been writing code since high school. My day job now is mostly backend and AI plumbing, which is a strange place to arrive at for someone who spent years caring a lot about front end frameworks. This post is about those years.&lt;/p&gt;

&lt;p&gt;The first thing I built that strangers actually used was a school election system, written in Pascal with Lazarus because that was the tool I had. It got rewritten more than once over the years, each time in whatever framework I had learned most recently. That habit, learning a tool and then looking for somewhere to put it, started early.&lt;/p&gt;

&lt;p&gt;The honest version of the early years: Angular first, because plenty of tutorials covered it and The Net Ninja wrote a good number of them. Then React, still in the class component era. Up to that point every choice made sense, because each one followed the material that existed.&lt;/p&gt;

&lt;p&gt;That part is fine. Following what is available is how most of us start, and it is a reasonable way to learn. The part I want to talk about starts one step after that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The choices that had nothing to do with the work
&lt;/h2&gt;

&lt;p&gt;Moving to Vue was not a technical decision. It was not better for the project I had in front of me. I had no benchmark, no comparison, no criteria list. I picked it because the people around me were on React, and I did not want to be one of them.&lt;/p&gt;

&lt;p&gt;The thought in my head was not "this will be faster to build". It was "this will be mine".&lt;/p&gt;

&lt;p&gt;Then Nuxt 2, for the same reason in reverse. The people near me used Next, so the choice fell to Nuxt. Again no comparison. Again the deciding factor was who I did not want to look like.&lt;/p&gt;

&lt;p&gt;CSS went the same way. I was proud of indented SASS, the syntax with no braces. If you had asked me what it bought me, I would have had nothing to say. It looked sharper in a code block, and that was enough. Plain CSS and SCSS felt boring, even though the browser ends up with the exact same result. 😅&lt;/p&gt;

&lt;p&gt;I am describing myself here. If you made a decision like this and it worked out, that is not a contradiction of anything below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it took me years to see it
&lt;/h2&gt;

&lt;p&gt;While you are still learning, you have nothing to point at. No product with real users, no system that has survived a few years of production. That is a normal stage. But it leaves a gap: you want something to show, and a stack is the cheapest thing to show.&lt;/p&gt;

&lt;p&gt;Think of a club jacket. You may not be able to ride yet, but the jacket already says you are part of the group that can. A stack does exactly that. Mention a slightly rare tool and people assume you understand more than you said.&lt;/p&gt;

&lt;p&gt;The places I was hanging out made this worse. Discord servers, Reddit threads, campus group chats with friends who were also learning. There was a small circle that knew better, and being in it felt good. Every time I said "ah, I don't use that one", something small happened in the conversation, and I got a little hit of being interesting. Pleasant things get repeated.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the bill looked like
&lt;/h2&gt;

&lt;p&gt;It arrived slowly enough that I did not connect it to the cause.&lt;/p&gt;

&lt;p&gt;The first cost was depth. Every switch puts you back at the surface: learn the routing, learn how state is handled, learn the folder conventions, learn the build config that nobody wrote down. I know a little about a lot of tools and I am genuinely good at few of them. Depth comes from staying somewhere long enough to hit the problems that only show up in month eight.&lt;/p&gt;

&lt;p&gt;The second cost was other people. If I am the only person on the project who understands the tool, everyone who touches that code pays for my choice. Something that felt like taste from my side looks like a learning tax from theirs.&lt;/p&gt;

&lt;p&gt;The third one is the one I still wince at. I became the kind of person who made a small face at other people's choices. "Still using that?" It sounds like a joke. Said often enough, it changes how you look at people, and it makes you worse at listening. Some of the people I said that to had better reasons than mine. I never asked what they were.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually survived
&lt;/h2&gt;

&lt;p&gt;After Vue came Svelte, then a migration to Nuxt 3, then a short attempt at TanStack and Astro that ended at the how-to guide, then finally Nuxt 4. What carried across all of that was not API knowledge. I could not write the router setup for half of those from memory today.&lt;/p&gt;

&lt;p&gt;What carried across was the thinking. How to break a feature into pieces, where state should actually live, why a page feels slow before anyone opens the profiler.&lt;/p&gt;

&lt;p&gt;At my current job the front end is vanilla. No directives, no compiler giving me a hand. That is where the difference becomes obvious: the parts I understand are the parts that survived. Everything else was a name I memorized for six months.&lt;/p&gt;

&lt;p&gt;I want to be clear about one thing, because it would be dishonest to leave this post as a warning. I do not regret any of it. Vue and Nuxt are what I reach for by default now, and they earned that over years rather than over one weekend. Go is the language I pick when I want the work to feel comfortable, and Python is where all the AI plumbing lives. That is a pretty ordinary stack. I just arrived at it from an odd direction, and it still landed somewhere good.&lt;/p&gt;

&lt;p&gt;CSS finished the same way. Bootstrap, then Tailwind, then PicoCSS out of curiosity, then back to Tailwind, then PostCSS because it was enough, then plain CSS. After going all the way around, the finish line is the thing I called boring in 2019. 🙃&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing differently was never the problem
&lt;/h2&gt;

&lt;p&gt;I want to be clear about this part, because I think it is where people usually misread a post like this. Choosing the unusual tool is allowed. Sometimes it is right. If the rare tool is the best fit for your problem, use it. I would rather work with someone who picks the small library for a real reason than someone who picks the popular one out of reflex.&lt;/p&gt;

&lt;p&gt;Two conditions, and that is the whole test: a technical reason you can state in one sentence, and a trade-off you can say out loud without getting defensive. "This is faster for our case, the community is smaller, and that is the risk." Say that sentence and nobody argues with your framework choice.&lt;/p&gt;

&lt;p&gt;So the mistake was never the framework. At the time, the mistake was the reason. The same tool can be a good decision or a status decision. Only the reason changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I ask myself now
&lt;/h2&gt;

&lt;p&gt;When something new trends, I give it a week instead of an evening. If I still want it after a week, and I can say what it buys me, I try it on a branch. If I cannot say what it buys me, I close the tab and go back to work.&lt;/p&gt;

&lt;p&gt;That is the whole rule. It is not strict, and I still break it. Being honest with yourself first is the cheap part. It is the &lt;code&gt;npm install&lt;/code&gt; afterwards that gets expensive.&lt;/p&gt;

&lt;p&gt;If you are in the middle of the phase I was in, nothing is broken. You will probably enjoy the tool you picked, and you will learn something from it even if the reason was not technical. The only thing I would ask you to keep is the sentence: can I explain why I chose this, out loud, without defending it?&lt;/p&gt;

&lt;p&gt;If yes, go. And if the reason turns out to be mostly vanity, that is fine as well. Mine was, for longer than I would like to admit, and I still ended up with a stack I like and a job I can do.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>javascript</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I built the dev tools I was tired of looking for</title>
      <dc:creator>Daffa Izzuddin</dc:creator>
      <pubDate>Thu, 29 Oct 2026 11:34:58 +0000</pubDate>
      <link>https://dev.to/izzudd/i-built-the-dev-tools-i-was-tired-of-looking-for-2ejh</link>
      <guid>https://dev.to/izzudd/i-built-the-dev-tools-i-was-tired-of-looking-for-2ejh</guid>
      <description>&lt;p&gt;My browser normally has a JSON formatter, a JSON to TypeScript converter, a markdown to document converter, an HTML email previewer, a slug generator, a time zone converter, and a URL encoder open in separate tabs. Each one is its own website with its own ads, its own cookie banner, and a good chance it wants me to sign in before it will format 400 bytes of JSON.&lt;/p&gt;

&lt;p&gt;The breaking point was pasting a work template into a free online preview tool and not being able to tell what it did with it. That is not a question I want to leave open, so I closed the tab and stopped using those.&lt;/p&gt;

&lt;p&gt;The rule now is simple: anything I would not paste into a public gist does not go into a tool I did not build.&lt;/p&gt;

&lt;p&gt;So I put the tools I actually use on one page: &lt;a href="https://quoin.izzudd.my.id" rel="noopener noreferrer"&gt;quoin.izzudd.my.id&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part where I admit how it was built
&lt;/h2&gt;

&lt;p&gt;This is 100% AI slop. I call it magic, and I am not going to hide that in the post where I announce it. I describe what I want, the model writes the code, I read it, I fix the parts that are wrong, and I keep the parts that work.&lt;/p&gt;

&lt;p&gt;What the model does not do is decide what belongs on the site. Every tool on Quoin exists because I hit that problem during real work, usually while annoyed. The selection is the product. The code is mostly generated, and I say that plainly because the alternative, a post full of "hand-crafted with love", is a claim you can check against the commit history.&lt;/p&gt;

&lt;p&gt;The name is the one part I will defend. A quoin is the wedge that locks type into a printing forme, and the corner stone that keeps a wall true. Small tool, keeps everything else in place.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I do all day, and the tool that covers it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structured output for agents.&lt;/strong&gt; I write a JSON Schema, then I need the same shape as Pydantic, Zod, or a TypeScript type. Handwriting those conversions is how you end up with a field mismatch at 2am. So: schema builder with inference from a sample payload, plus a JSON to types tool that emits Pydantic, Zod, TS, Go structs, and Python dataclasses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown into Word or Google Docs.&lt;/strong&gt; I take notes in Markdown, then someone asks for a document. Paste, convert, paste into Docs, formatting survives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email templates for customers.&lt;/strong&gt; I want to see the HTML the way the recipient will see it, before it goes out. Live preview, no upload.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URLs copied out of a terminal.&lt;/strong&gt; A long URL wraps across three lines and the copy brings the newlines and indentation with it, so pasting it into a browser loads nothing. Strip whitespace, then open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broken URLs from partners.&lt;/strong&gt; Spaces, mixed case, accents, tracking junk, trailing punctuation from a chat message. Sanitize, slugify, encode, done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time zones.&lt;/strong&gt; I am in WIB (UTC+7). The team is in UTC, Italy, Singapore, and Hong Kong. Converting by feel is how meetings get missed, and half the converters online get the abbreviation wrong in summer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dirty CSV into an INSERT statement.&lt;/strong&gt; When I need seed data in a dev database, I want the INSERT now, not an import pipeline with a wizard and a schema mapping step. Paste the CSV from Excel, pick MySQL or Postgres, copy the statement, done. The column types are inferred from your data, so the inference gets some columns wrong, and for throwaway data I do not care. I am not proud of this workflow, but it is the one I use most, and it is fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Looking at JSON.&lt;/strong&gt; Sometimes I do not need to edit it, I need to see the shape of it. Collapsible tree, search across keys and values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That list is boring and specific on purpose. None of it is a hard problem. All of it costs ten minutes a day when the tools are scattered across six sites that each want something from me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opinionated by design
&lt;/h2&gt;

&lt;p&gt;The rules are mine and they are not up for a product debate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No accounts. There is nothing to sync, so there is nothing to sign in to.&lt;/li&gt;
&lt;li&gt;Nothing leaves the tab. Every operation is a function running on your machine. No API call, no telemetry, no analytics SDK.&lt;/li&gt;
&lt;li&gt;No AI inside the product. AI wrote the code. The tools themselves are deterministic, and I want them to give the same answer every time.&lt;/li&gt;
&lt;li&gt;No workspace, no dashboard, no onboarding tour. Open it, use it, close it.&lt;/li&gt;
&lt;li&gt;Dirty is allowed. The CSV to INSERT tool infers your column types and sometimes infers them wrong. For seed data that is a fair trade: it is a helper for throwaway data, not a migration tool, and I would rather it be fast than be right about everything.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a tool needs a server, a login, or a paid tier, it does not get added. That constraint removes a lot of features I would otherwise have to build, which is the part I like most about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is in there now
&lt;/h2&gt;

&lt;p&gt;Six groups: JSON, strings, time, tables, web and HTML, markdown. I am not putting a number on it, because the number changes every time I get annoyed, and that is the point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JSON:&lt;/strong&gt; beautifier and minifier, interactive tree visualizer, stringify and unescape, schema builder with inference, JSON to Pydantic/Zod/TS/Go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strings:&lt;/strong&gt; escaper and unescaper for HTML entities, URL components, regex specials, C-style slashes, and Base64; whitespace remover; slugifier; base encoder; text and Git diff.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time:&lt;/strong&gt; a DST-aware time zone converter, so the abbreviation is right in summer and in winter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tables:&lt;/strong&gt; table and CSV editor, plus CSV to SQL INSERT statements for MySQL, PostgreSQL, SQLite and MSSQL with JSONL, TSV, Markdown and JSON export.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web:&lt;/strong&gt; HTML and email preview.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Markdown:&lt;/strong&gt; live editor and preview, plus conversion to a paste-ready format.&lt;/p&gt;

&lt;p&gt;Press &lt;code&gt;Ctrl+P&lt;/code&gt; for the command palette, pin the tools you use daily, and your drafts survive a reload.&lt;/p&gt;

&lt;h2&gt;
  
  
  It keeps growing, and that is the invitation
&lt;/h2&gt;

&lt;p&gt;Quoin is not a startup and it is not trying to become one. It is where I add a tool the next time I get annoyed. If you have the same annoyance, there are three ways in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open an issue&lt;/strong&gt; with the workflow you need. If it fits the rules above, it gets built.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send a PR.&lt;/strong&gt; The tool registry is one file and a tool page is one file, with the same skeleton for all of them, so adding a tool is a small diff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fork it.&lt;/strong&gt; Change the rules, add the server, add your own auth, keep your fork private for your team. It is MIT, and I would rather you have the tool you actually need.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Live: &lt;a href="https://quoin.izzudd.my.id" rel="noopener noreferrer"&gt;quoin.izzudd.my.id&lt;/a&gt;&lt;br&gt;
Source: &lt;a href="https://github.com/izzudd/quoin" rel="noopener noreferrer"&gt;github.com/izzudd/quoin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you use it and something breaks, tell me and I will fix it. If you do not, that is fine too.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>tooling</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
