<?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>Forem: Saravanan Ramupillai</title>
    <description>The latest articles on Forem by Saravanan Ramupillai (@saravanan_ramupillai).</description>
    <link>https://forem.com/saravanan_ramupillai</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%2F63962%2F2f51f463-18d2-4d3d-8f5d-c170ff777187.jpeg</url>
      <title>Forem: Saravanan Ramupillai</title>
      <link>https://forem.com/saravanan_ramupillai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/saravanan_ramupillai"/>
    <language>en</language>
    <item>
      <title>Build the Environment, Not the Agent</title>
      <dc:creator>Saravanan Ramupillai</dc:creator>
      <pubDate>Sat, 09 May 2026 03:23:19 +0000</pubDate>
      <link>https://forem.com/saravanan_ramupillai/build-the-environment-not-the-agent-3f05</link>
      <guid>https://forem.com/saravanan_ramupillai/build-the-environment-not-the-agent-3f05</guid>
      <description>&lt;p&gt;If you are building agents, the most important decision you make is where to put the work that keeps the agent safe. Most of it goes into the agent — better prompts, more rules, tighter tool lists, careful output filters. That approach works. But there is a different approach that produces stronger results with less ongoing effort, and it starts from a different idea about what keeps an agent safe in the first place.&lt;br&gt;
Let me start with a toy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shape Sorter
&lt;/h2&gt;

&lt;p&gt;A toddler gets a shape sorter. A board with holes. Square block, round block, triangle block.&lt;br&gt;
Nobody explains the rules. The toddler tries the square in the round hole. It doesn't fit. They rotate it. Still no. They try the next hole. Click.&lt;br&gt;
The toddler learned the rules by running into them. The toy didn't lecture. It just refused.&lt;br&gt;
This is how agents should be kept safe. And how they should be built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Work Usually Goes
&lt;/h2&gt;

&lt;p&gt;The default approach is to make the agent itself safe. Pick a model. Write a long prompt full of rules. Don't delete files. Don't call this API. Don't go outside the workspace. Don't say anything harmful. Trim the tool list to remove dangerous capabilities. Add output filters to catch bad responses on the way out. Tune the system carefully and watch closely.&lt;br&gt;
This works. It produces working agents. But it has a limit worth naming.&lt;/p&gt;

&lt;p&gt;The rules in the prompt are suggestions, not enforcement. A prompt that says don't delete files is a request. The agent honors it most of the time. Then a prompt injection slips in, or the model misreads context, or someone phrases something unexpectedly, and the rule dissolves. Words on a page have never physically stopped anyone from doing anything. The trim and the filter help, but they are bandages over the same wound — the agent itself is not the place where the safety actually lives.&lt;br&gt;
You can keep building this way. But there is another approach, and it produces real safety guarantees instead of polite requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Work Belongs
&lt;/h2&gt;

&lt;p&gt;Build the environment first. Then write the manual. Then let the agent walk in.&lt;br&gt;
Three pieces, in that order. Lets take a example of support agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Support Agent
&lt;/h2&gt;

&lt;p&gt;Think about how a customer support specialist comes to exist on a real team.&lt;br&gt;
A new hire is not a different species from anyone else on day one. They start as a regular person who can read, write, and reason. What makes them safe to put in front of customers is two things, in order.&lt;/p&gt;

&lt;p&gt;First, the &lt;strong&gt;support environment&lt;/strong&gt;. The ticketing system. The CRM. The knowledge base. The refund tool with its hard cap. The escalation queue. The auth scope that only lets them see their own queue, not customer payment details. The communication channel that scans every outbound message before it reaches the customer. The environment doesn't care what the new hire intends. Try to refund more than the system allows — denied. Try to open a ticket that belongs to another team — blocked. Try to email a customer through an unapproved channel — rejected. Try to send a reply containing abusive language or leaked customer data — the channel filters it before it ever leaves. The environment is what holds the company together. It is the world the work happens in.&lt;/p&gt;

&lt;p&gt;Second, the &lt;strong&gt;support playbook&lt;/strong&gt;. How to greet a customer. How to triage a ticket. When to escalate. What to say when the answer is "no." Tone guidelines. Common scenarios with worked examples. The playbook is a head start — it lets the new hire skip the obvious mistakes and get useful on day three instead of day thirty.&lt;br&gt;
Drop a competent person into a real support environment with the playbook on their screen, and within a few weeks, you can trust them with real customers.&lt;/p&gt;

&lt;p&gt;Now ask: which of these two actually keeps the company from accidentally refunding a million dollars to the wrong customer, or sending a furious reply with a leaked password attached?&lt;br&gt;
The environment. Always the environment. &lt;/p&gt;

&lt;p&gt;The playbook is just a document. If the new hire ignores the playbook, misreads it, or never opens it, the company doesn't lose money because of the playbook — the system never let the refund go through. The customer doesn't receive an angry message with confidential data — the channel never let it leave. The environment is what reality is. The playbook is what someone wrote down about reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Asymmetry
&lt;/h2&gt;

&lt;p&gt;This is the part most people miss.&lt;br&gt;
&lt;strong&gt;The environment enforces. The manual only informs.&lt;/strong&gt;&lt;br&gt;
The environment is physical. It responds to attempts, not intentions. Try something allowed, it succeeds. Try something disallowed, it fails. Operation not permitted. The agent cannot argue with it.&lt;/p&gt;

&lt;p&gt;The manual is informational. It teaches. It accelerates. But it has no power over the agent. The agent can read it, ignore it, hallucinate around it, or be talked out of it by a prompt injection. None of that matters, because the manual was never the thing keeping the agent safe. The environment was.&lt;/p&gt;

&lt;p&gt;Take the manual away and you still have a safe system. The agent will be slower — it will have to discover the patterns by trying, like the toddler at the shape sorter. But it cannot do harm. The environment never let it.&lt;/p&gt;

&lt;p&gt;Take the environment's enforcement away and no manual can save you. The most carefully written manual in the world is a polite request. The agent will follow it most of the time, until the moment it doesn't. That moment is when you find out you never had safety at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Builder's Order
&lt;/h2&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%2Fhanm7xn8iki50zdnk5mt.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%2Fhanm7xn8iki50zdnk5mt.png" alt="Agent working on Environment with Manual" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are building an agent system, do these in order.&lt;br&gt;
First, shape the environment. Decide what's possible. Choose the tools, the boundaries, the feedback loops, the outbound checks. This is the only step that protects you. Get this wrong and nothing downstream helps.&lt;/p&gt;

&lt;p&gt;Second, write the manual. Now that the environment exists, describe it. The tools. The patterns. The conventions. This step does not protect you — the environment already did. This step makes the agent fast.&lt;/p&gt;

&lt;p&gt;Third, let the agent walk in. It reads the manual, observes the environment, and starts working. If the first two steps were done well, it gets useful quickly. And if it ignores the manual entirely, the environment will still hold.&lt;/p&gt;

&lt;p&gt;The common pattern is to do these in reverse — start with the agent, then bolt on tools, then think about safety last. That order can ship working systems, but each layer ends up retrofitting around the one before it. Building in the order above means each layer rests on the one below.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Whole Craft
&lt;/h2&gt;

&lt;p&gt;Don't build a cage around your agent. Build a world for it.&lt;br&gt;
A world with physics — real, deterministic rules that hold whether the agent reads anything or not, whether its intentions are good or bad. That is the foundation.&lt;/p&gt;

&lt;p&gt;A manual on the shelf, telling the agent how this world works. A head start, not a fence.&lt;br&gt;
Then turn the agent loose. Let it try things. Let it fail. Let it learn the shape of what is possible by colliding with what isn't.&lt;br&gt;
Build the environment first. That is the part that protects you. Write the manual second. That is the part that makes the agent fast. Let the agent walk in third.&lt;/p&gt;

&lt;p&gt;That is the whole craft.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>Rethinking LLM-Powered Apps: Ditching Tool Overload for Smarter Query Abstraction</title>
      <dc:creator>Saravanan Ramupillai</dc:creator>
      <pubDate>Wed, 03 Sep 2025 11:13:53 +0000</pubDate>
      <link>https://forem.com/saravanan_ramupillai/rethinking-llm-powered-apps-ditching-tool-overload-for-smarter-query-abstraction-1aan</link>
      <guid>https://forem.com/saravanan_ramupillai/rethinking-llm-powered-apps-ditching-tool-overload-for-smarter-query-abstraction-1aan</guid>
      <description>&lt;p&gt;I had one problem to solve, which is exposing system to LLM so that user queries can be addressed in a modern semantic way instead of just relying calling bunch of REST API calls. Preparing the system readiness for accessing it via any modality.&lt;/p&gt;

&lt;p&gt;Initially I thought of writing bunch of tools and attaching it to LLM would solve the problem. It turned out that we cannot write tools for every functionality of the system also overloading the LLM with more number of tools will results in poor/improper tool selection leading to lot of problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Tools Don't Scale in LLM Routing from what I've seen in my projects:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool Selection Struggles:&lt;/strong&gt; The LLM has to pick from a growing list, which leads to mistakes, delays, and wonky outputs. Once you cross 15-20 tools, it gets messy—the context overloads, and accuracy dips.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Step Messes:&lt;/strong&gt; Complex stuff requires chaining tools (fetch → verify → process), each a separate call. That means more back-and-forth, higher latency, and more spots for errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upkeep Nightmares:&lt;/strong&gt; Documenting and securing all those tools is a pain. One wrong call, and you've got a security hole.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Basically, overloading the LLM with tools turns it into an inefficient mess. There has to be a better way.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then I asked this question: Before LLM comes in, If I want to expose my system to outside world I will do one or both of the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Exposing an REST APIs&lt;/li&gt;
&lt;li&gt;Exposing a Client SDK that abstracts away all the complexity of 
API, Permission, Etc..&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I thought why not bring it back to LLM specifically the SDK part, And since LLMs are very good at coding, writing a code using SDK is going to be very much efficient compared to bunch of back and forth tool calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Abstracting System as a Query Language via SDK:
&lt;/h3&gt;

&lt;p&gt;I wrote a complete OOP SDK by abstracting out all the functionality (Entity based) of my app and wrote simple developer documentation on how to use this SDK.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LLM Efficiency:&lt;/strong&gt; No tool-picking headache—the LLM just writes a query based on intent. It's quicker and more precise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster and More Reliable:&lt;/strong&gt; One query beats multiple tool hops, cutting down on delays and failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in Security:&lt;/strong&gt; RBAC is in the engine. It uses user context (like ID and roles) to enforce access. The LLM generates the query but never sees unauthorized stuff—the engine filters it all.
Scales Effortlessly: Extend the SDK for new features. No tool proliferation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Query SDK for &lt;strong&gt;Project Management system&lt;/strong&gt;:
&lt;/h2&gt;

&lt;p&gt;Picture a project management app. A manager says: "Show me weekly stats for my project, tailored to my view."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old way:&lt;/strong&gt; LLM calls tools for fetch, permissions, analysis—clunky and error-prone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New way:&lt;/strong&gt; LLM crafts a JS query with the SDK. Engine executes, applies RBAC (e.g., manager sees budgets, others don't), returns data. LLM then customises the output—charts, tables, whatever fits.&lt;/p&gt;

&lt;p&gt;Sample query the LLM might generate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// SDK Query (LLM-Generated)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;project-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Import the SDK&lt;/span&gt;

&lt;span class="c1"&gt;// Fetch project for the user (RBAC handled automatically)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getProjectForUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;userId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// userId from session/context&lt;/span&gt;

&lt;span class="c1"&gt;// Get weekly breakdown&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getWeeklyAnalysis&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;teamHours&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;taskCompletionRate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;budgetVariance&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;period&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;last7Days&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Aggregate if it makes sense&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;aggregated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aggregateByTeam&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Return for LLM to format&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;aggregated&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Engine side:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;getProjectForUser&lt;/strong&gt; only gives accessible projects.&lt;/li&gt;
&lt;li&gt;Analysis checks roles—no access, no data.&lt;/li&gt;
&lt;li&gt;Fails safely if needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LLM takes the results and tailors Dashboard viz for managers, basic summary for teams, or different formats like pies or CSVs. Nails the use case, keeps the LLM focused on query gen and output styling.&lt;/p&gt;

&lt;h3&gt;
  
  
  LLM with tool flow fatigue
&lt;/h3&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%2Ftaxm1txah7lnbsq083sr.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%2Ftaxm1txah7lnbsq083sr.png" alt="LLM with many tool fatigue" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  LLM with Query Layer
&lt;/h3&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%2Fkfqqpqs0955r3729fv2k.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%2Fkfqqpqs0955r3729fv2k.png" alt="LMM with Query Layer" width="800" height="924"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thinking to extend it for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Semantic data layer can be quickly implemented with proper ACL over multiple datasource.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>llm</category>
      <category>sdl</category>
    </item>
    <item>
      <title>Here are my Learnings when publishing a npm package</title>
      <dc:creator>Saravanan Ramupillai</dc:creator>
      <pubDate>Fri, 01 Oct 2021 03:26:06 +0000</pubDate>
      <link>https://forem.com/saravanan_ramupillai/here-are-my-learnings-when-publishing-a-npm-package-27ep</link>
      <guid>https://forem.com/saravanan_ramupillai/here-are-my-learnings-when-publishing-a-npm-package-27ep</guid>
      <description>&lt;p&gt;&lt;a href="https://groupstudy.dev/how-to-publish-npm-package"&gt;https://groupstudy.dev/how-to-publish-npm-package&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>react</category>
      <category>programming</category>
    </item>
    <item>
      <title>Skypack + Webpack = 🎉</title>
      <dc:creator>Saravanan Ramupillai</dc:creator>
      <pubDate>Tue, 21 Sep 2021 07:24:48 +0000</pubDate>
      <link>https://forem.com/saravanan_ramupillai/skypack-webpack-3ofa</link>
      <guid>https://forem.com/saravanan_ramupillai/skypack-webpack-3ofa</guid>
      <description>&lt;p&gt;I wrote on benefit of skypack and how to use it in project to improve page the performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://groupstudy.dev/skypack-webpack"&gt;Best way to reduce bundle size is to not have third party dependencies inside source code.&lt;/a&gt;
&lt;/h2&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>react</category>
      <category>webpack</category>
    </item>
    <item>
      <title>Dev editor upgraded</title>
      <dc:creator>Saravanan Ramupillai</dc:creator>
      <pubDate>Sat, 28 Sep 2019 14:09:10 +0000</pubDate>
      <link>https://forem.com/saravanan_ramupillai/dev-editor-upgraded-48io</link>
      <guid>https://forem.com/saravanan_ramupillai/dev-editor-upgraded-48io</guid>
      <description>&lt;h1&gt;
  
  
  &lt;a href="https://deveditor.dev/"&gt;Dev editor&lt;/a&gt; got some new feature
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Support for lists&lt;/li&gt;
&lt;li&gt;Live previews of embeds&lt;/li&gt;
&lt;li&gt;Draft mode.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Last month i released minimal version of editor to write dev blogs without remembering markdown syntax.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/saravanan_ramupillai" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TU-a9LIJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--I51LsU3H--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/63962/2f51f463-18d2-4d3d-8f5d-c170ff777187.jpeg" alt="saravanan_ramupillai image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/saravanan_ramupillai/write-your-dev-blocks-quickly-using-this-editor-36fk" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Write your dev blocks quickly using this editor.&lt;/h2&gt;
      &lt;h3&gt;Saravanan Ramupillai ・ Sep  8 '19 ・ 1 min read&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#frontend&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
 

&lt;p&gt;Now it got some missed out feature like live preview of embeds and list.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/xrmx20305w"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;

&lt;p&gt;And with Auto draft mode, all your changes are saved locally so you can resume your writing later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notes: This blog is written using &lt;a href="https://deveditor.dev"&gt;devedior&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>dev</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Write your dev blocks quickly using this editor.</title>
      <dc:creator>Saravanan Ramupillai</dc:creator>
      <pubDate>Sun, 08 Sep 2019 17:40:43 +0000</pubDate>
      <link>https://forem.com/saravanan_ramupillai/write-your-dev-blocks-quickly-using-this-editor-36fk</link>
      <guid>https://forem.com/saravanan_ramupillai/write-your-dev-blocks-quickly-using-this-editor-36fk</guid>
      <description>&lt;h1&gt;
  
  
  Hi all, I am super excited you tell you that now you can write down dev blogs quickly using &lt;a href="https://deveditor.dev"&gt;dev-editor&lt;/a&gt;. Here is how
&lt;/h1&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/L2jaQWOiJmA"&gt;
&lt;/iframe&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;em&gt;P.S: This blog is created using dev-editor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Feedback and Contributions are most welcome. Fork it here *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/saravanan10393/dev-editor"&gt;https://github.com/saravanan10393/dev-editor&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>frontend</category>
      <category>react</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
