<?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: Dmitry Olkhovoi</title>
    <description>The latest articles on DEV Community by Dmitry Olkhovoi (@dmitryolkhovoi).</description>
    <link>https://dev.to/dmitryolkhovoi</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%2F324851%2F92cf8b7e-d2b6-46da-b281-820ef3e87d42.jpeg</url>
      <title>DEV Community: Dmitry Olkhovoi</title>
      <link>https://dev.to/dmitryolkhovoi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dmitryolkhovoi"/>
    <language>en</language>
    <item>
      <title>Sketch‑Programming (LLM Transpiler) — what is it?</title>
      <dc:creator>Dmitry Olkhovoi</dc:creator>
      <pubDate>Fri, 26 Dec 2025 23:26:56 +0000</pubDate>
      <link>https://dev.to/dmitryolkhovoi/sketch-programming-llm-transpiler-what-is-it-12df</link>
      <guid>https://dev.to/dmitryolkhovoi/sketch-programming-llm-transpiler-what-is-it-12df</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/DmitryOlkhovoi/Sketch-programming" rel="noopener noreferrer"&gt;github project&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Started
&lt;/h2&gt;

&lt;p&gt;It all began with yet another crazy idea: trying to write my own programming language, compiler, or transpiler…&lt;br&gt;&lt;br&gt;
That’s what happens when you get tired of forms and buttons.&lt;/p&gt;

&lt;p&gt;Writing a compiler from scratch is pretty boring.&lt;br&gt;&lt;br&gt;
You already know the result, and what lies ahead is routine work: parsing, building an AST, and so on.&lt;br&gt;&lt;br&gt;
I got bored quickly.&lt;/p&gt;

&lt;p&gt;Then I remembered Babel. I vaguely know its internals and am familiar with Babylon (now &lt;code&gt;@babel/parser&lt;/code&gt;).&lt;br&gt;&lt;br&gt;
Roughly speaking, it parses code and produces an AST. We can extend JavaScript with features from newer standards not yet supported by all browsers.&lt;/p&gt;

&lt;p&gt;Some people call it a compiler, others a transpiler — at this point, it’s mostly a matter of taste.&lt;/p&gt;


&lt;h2&gt;
  
  
  React Fatigue and Motivation
&lt;/h2&gt;

&lt;p&gt;Around the same time, I was giving internal talks about &lt;em&gt;new and interesting frameworks&lt;/em&gt;:&lt;br&gt;&lt;br&gt;
Adonis, Edge, Alpine, signals, Svelte, Solid, HTMX — and about why React is a hopelessly outdated framework that hasn’t achieved its original goals since 2013&lt;br&gt;&lt;br&gt;
(okay, that was a hot take — I keep promising to write a separate article about this).&lt;/p&gt;

&lt;p&gt;Despite not liking React, I still have to use it in at least five projects.&lt;br&gt;&lt;br&gt;
A huge amount of code is written in it, so I’ll be dealing with it for a long time.&lt;/p&gt;

&lt;p&gt;React does have advantages — especially where the virtual DOM is used not just for markup, but for native components or alternative render targets.&lt;br&gt;&lt;br&gt;
Still, declaring two variables just to get one reactive value using a hook became unbearable.&lt;/p&gt;

&lt;p&gt;I wanted to change how components are written.&lt;/p&gt;

&lt;p&gt;Should I write another Babel plugin? Another CoffeeScript?&lt;br&gt;&lt;br&gt;
I wanted &lt;strong&gt;free syntax&lt;/strong&gt; and &lt;strong&gt;simple implementation&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why LLMs Change Everything
&lt;/h2&gt;

&lt;p&gt;No matter how good your AST parser is, language syntax is still limited by… syntax.&lt;br&gt;&lt;br&gt;
You need strict rules: quotes, braces, indentation.&lt;br&gt;&lt;br&gt;
The dream is implicit returns, declarative code, config-like syntax — and that brings us back to boring ASTs.&lt;/p&gt;

&lt;p&gt;But what if we ask an LLM to transform one text into another &lt;strong&gt;by examples&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;We describe the syntax and get JavaScript, C++, or even assembly as output — which we can then execute.&lt;/p&gt;

&lt;p&gt;Example idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sumValues args
  sum args
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Translated into JS:&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;function&lt;/span&gt; &lt;span class="nf"&gt;sumValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;[]):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&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;LLMs change software development as dramatically as the transition from assembly to high-level languages.&lt;/p&gt;

&lt;p&gt;But with one key difference:&lt;br&gt;&lt;br&gt;
LLMs introduce &lt;strong&gt;non-deterministic abstraction&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We can no longer store prompts in Git and expect the same result every time.&lt;/p&gt;


&lt;h2&gt;
  
  
  Sketch Programming vs Vibe Coding
&lt;/h2&gt;

&lt;p&gt;Many are now talking about &lt;em&gt;agent abstractions&lt;/em&gt; — agents that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fetch designs from Figma,&lt;/li&gt;
&lt;li&gt;create Jira tickets,&lt;/li&gt;
&lt;li&gt;open PRs,&lt;/li&gt;
&lt;li&gt;deploy projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s a big topic.&lt;/p&gt;

&lt;p&gt;Here, I’m talking about a &lt;strong&gt;transitional approach&lt;/strong&gt; — something between classic programming and vibe coding (where the model writes everything for you).&lt;/p&gt;


&lt;h2&gt;
  
  
  React Example
&lt;/h2&gt;

&lt;p&gt;Declaring state in React today:&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCounter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What I want instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;state counter number = 0;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or even:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;counter = 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the explicit &lt;code&gt;state&lt;/code&gt; keyword improves readability — mostly for humans.&lt;br&gt;&lt;br&gt;
The LLM can infer intent from JSX anyway, but extra context may reduce hallucinations.&lt;/p&gt;


&lt;h2&gt;
  
  
  Full Component Example
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Sketch
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// @sketch:reactComponent
// @ext:tsx

Component Count
props add = 0
state count = 0

effect {
  console.log("Component mounted");
  cleanup {
    console.log("Cleanup");
  }
}

&amp;lt;div onclick="count += add"&amp;gt;Will add {add}&amp;lt;/div&amp;gt;
&amp;lt;div&amp;gt;
  Current count: {count}
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Generated React Code
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;add&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CountComponent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Props&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Component mounted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cleanup&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="p"&gt;[]);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Will add &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Current count: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;CountComponent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Less boilerplate.&lt;br&gt;&lt;br&gt;
Better readability.&lt;br&gt;&lt;br&gt;
Full TypeScript support.&lt;/p&gt;


&lt;h2&gt;
  
  
  VS Code Plugin
&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%2F2xyysrr7xw6w554tr3gr.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%2F2xyysrr7xw6w554tr3gr.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To make this usable, the transformation must happen &lt;strong&gt;inside the editor&lt;/strong&gt; — not in a chat window.&lt;/p&gt;

&lt;p&gt;So I built a VS Code plugin that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;runs on save,&lt;/li&gt;
&lt;li&gt;sends sketch files to ChatGPT via API,&lt;/li&gt;
&lt;li&gt;replaces them with valid code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s open source and has bugs (e.g., config not reloading). Contributions welcome.&lt;/p&gt;


&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Initialize a project
&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;sketch/&lt;/code&gt; directory contains syntax definitions (Markdown)
&lt;/li&gt;
&lt;li&gt;A mirrored &lt;code&gt;src/&lt;/code&gt; directory outputs valid code
&lt;/li&gt;
&lt;li&gt;Files include tags like:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// @sketch:reactComponent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The plugin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creates an OpenAI Assistant,&lt;/li&gt;
&lt;li&gt;uploads sketch definitions into a vector store,&lt;/li&gt;
&lt;li&gt;uses them as transformation rules.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  CSS Sketches Example
&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%2Fzls8ts89j8tbkctnbmzo.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%2Fzls8ts89j8tbkctnbmzo.png" alt=" " width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can even invent new “dialects”, like CSS Next:&lt;/p&gt;
&lt;h3&gt;
  
  
  Nested selectors
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="err"&gt;.title&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;→&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&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;h3&gt;
  
  
  Media queries as properties
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1200px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="err"&gt;width@&lt;/span&gt;&lt;span class="py"&gt;max-768&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&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;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1200px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;768px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.container&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&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;ChatGPT is surprisingly good at inventing these syntaxes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Yes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LLMs are non-deterministic&lt;/li&gt;
&lt;li&gt;It’s slower than a local transpiler&lt;/li&gt;
&lt;li&gt;Syntax highlighting is hard&lt;/li&gt;
&lt;li&gt;Caching and reproducibility matter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But these are &lt;strong&gt;engineering problems&lt;/strong&gt;, not conceptual dead ends.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Sketch programming is &lt;strong&gt;not&lt;/strong&gt; about killing compilers.&lt;br&gt;&lt;br&gt;
It’s about rethinking the &lt;strong&gt;entry point into code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stop rigidly binding to formal syntax;&lt;/li&gt;
&lt;li&gt;describe intent, structure, and patterns;&lt;/li&gt;
&lt;li&gt;delegate mechanical transformation to the model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike vibe coding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you have source text,&lt;/li&gt;
&lt;li&gt;explicit transformation rules,&lt;/li&gt;
&lt;li&gt;predictable output format.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a transitional layer between classic programming and an agent-driven future.&lt;/p&gt;

&lt;p&gt;The real question is no longer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Which language should we write in?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How do we want to express ideas in code at all?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/DmitryOlkhovoi/Sketch-programming" rel="noopener noreferrer"&gt;github project&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>javascript</category>
      <category>llm</category>
      <category>react</category>
    </item>
  </channel>
</rss>
