<?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 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>
