<?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: Dope Flamingo</title>
    <description>The latest articles on Forem by Dope Flamingo (@dope_flamingo).</description>
    <link>https://forem.com/dope_flamingo</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%2F620400%2Fd8d1c0e9-22ca-4aac-b30d-c2517d2732e8.jpeg</url>
      <title>Forem: Dope Flamingo</title>
      <link>https://forem.com/dope_flamingo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dope_flamingo"/>
    <language>en</language>
    <item>
      <title>I built a Streamlit alternative because I hated "Full-Script Reruns" (Introducing Violit) 🚀</title>
      <dc:creator>Dope Flamingo</dc:creator>
      <pubDate>Sun, 08 Feb 2026 12:00:17 +0000</pubDate>
      <link>https://forem.com/dope_flamingo/i-built-a-streamlit-alternative-because-i-hated-full-script-reruns-introducing-violit-1eg0</link>
      <guid>https://forem.com/dope_flamingo/i-built-a-streamlit-alternative-because-i-hated-full-script-reruns-introducing-violit-1eg0</guid>
      <description>&lt;h3&gt;
  
  
  👋 Hi, I'm a developer who loves Python.
&lt;/h3&gt;

&lt;p&gt;I’m a software engineer working in the industry, and I’ve spent my nights and weekends grinding on this open-source project.&lt;/p&gt;

&lt;p&gt;Personally, I really love &lt;strong&gt;Streamlit&lt;/strong&gt;. Its intuitive syntax is a game-changer, and many of my friends in AI/Data research use it for prototyping every day.&lt;/p&gt;

&lt;p&gt;But as projects grew, I saw them suffering from a structural performance issue: &lt;strong&gt;"The Full-Script Rerun."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every time you click a button, the &lt;em&gt;entire&lt;/em&gt; Python script runs from top to bottom. Watching the loading spinner spin endlessly (or seeing the app crash) made me want to fix this as a developer.&lt;/p&gt;

&lt;p&gt;I tried recommending &lt;strong&gt;NiceGUI&lt;/strong&gt; as an alternative. It's great, but the feedback was consistent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The syntax is too different from Streamlit."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Customizing the design (Material Design) is too hard."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, I decided to take matters into my own hands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What if I built a tool that is as easy as Streamlit, but as fast as React?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s how &lt;strong&gt;Violit&lt;/strong&gt; was born.&lt;/p&gt;




&lt;h3&gt;
  
  
  💜 The Philosophy behind Violit
&lt;/h3&gt;

&lt;p&gt;Violit is built on top of &lt;strong&gt;FastAPI&lt;/strong&gt; and &lt;strong&gt;Shoelace (Web Components)&lt;/strong&gt;. My architectural goals were clear:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fine-grained Reactivity:&lt;/strong&gt; When data changes, update &lt;em&gt;only&lt;/em&gt; the specific component. &lt;strong&gt;No full page reruns.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Learning Curve:&lt;/strong&gt; If you know Streamlit, you should be able to use Violit in 10 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beautiful by Default:&lt;/strong&gt; You shouldn't need to know CSS to make it look good. Just set &lt;code&gt;theme="cyberpunk"&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  🔥 Show me the Code
&lt;/h3&gt;

&lt;p&gt;Violit inherits the developer experience of Streamlit. You don't need to know complex &lt;code&gt;callbacks&lt;/code&gt; or &lt;code&gt;useEffect&lt;/code&gt;. The flow of your Python code becomes the UI.&lt;/p&gt;

&lt;p&gt;Python&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import violit as vl

app = vl.App(title="Violit Demo")

# State declaration (Similar to React's useState or SolidJS signals)
count = app.state(0)

# Clicking the button updates ONLY the 'count' variable.
# No full script rerun happens.
app.button("Increment", on_click=lambda: count.set(count.value + 1))

# When 'count' changes, only this text component updates.
app.text("Current Count:", count)

app.run()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⚡ Benchmark: Streamlit vs. Violit
&lt;/h3&gt;

&lt;p&gt;Because Violit uses &lt;strong&gt;fine-grained reactivity&lt;/strong&gt;, it doesn't need to re-read data or re-render the entire DOM when a state changes.&lt;/p&gt;

&lt;p&gt;Here is a comparison of rendering speeds when plotting graphs with large datasets:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Data Points&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Streamlit Rendering&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Violit Rendering&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;100K&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~62ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~14ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;500K&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~174ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~20ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~307ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~24ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fjtm81rby0jd0anx2hor9.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%2Fjtm81rby0jd0anx2hor9.png" alt=" " width="800" height="361"&gt;&lt;/a&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%2Ft0f1bemgz3y3tfqwr89v.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%2Ft0f1bemgz3y3tfqwr89v.png" alt=" " width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, Violit shows minimal performance degradation even with large datasets, as it bypasses the heavy rerun cycle.&lt;/p&gt;

&lt;h4&gt;
  
  
  Another Benchmark : Initial Chart Loading Speed (5 Million Data Points)
&lt;/h4&gt;

&lt;p&gt;This comparison shows the rendering of a graph plot using 5 million generated data points. (Top: Streamlit, Bottom: Violit)&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%2Fov24atsxky7bb6rh6suq.gif" 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%2Fov24atsxky7bb6rh6suq.gif" alt=" " width="600" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, Violit demonstrates a drastically faster app startup speed compared to Streamlit.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎨 20+ Themes, One Line of Code
&lt;/h3&gt;

&lt;p&gt;I believe that &lt;strong&gt;"Aesthetics are a feature."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Violit comes with over 20 preset themes ranging from &lt;code&gt;bootstrap&lt;/code&gt; to &lt;code&gt;cyberpunk&lt;/code&gt; and &lt;code&gt;vaporwave&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Bootstrap&lt;/p&gt;

&lt;ul&gt;
&lt;li&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%2Fpo5it6izkeak09gh5u7q.png" alt=" " width="800" height="633"&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Dracula&lt;/p&gt;

&lt;ul&gt;
&lt;li&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%2Fv9fh0xi45obg8ovnr2dn.png" alt=" " width="800" height="633"&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Hand-drawn&lt;/p&gt;

&lt;ul&gt;
&lt;li&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%2Fj235so92dvrm4a1zgk9h.png" alt=" " width="800" height="633"&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;You can switch the entire look of your app with a single argument.&lt;/p&gt;




&lt;h3&gt;
  
  
  🌐 "I built the Violit website... with Violit"
&lt;/h3&gt;

&lt;p&gt;Talk is cheap. To prove that Violit is ready for production (MVP), I built the &lt;strong&gt;official landing page and documentation entirely using Violit.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Landing Page:&lt;/strong&gt; &lt;a href="https://violit.cloud/" rel="noopener noreferrer"&gt;violit.cloud&lt;/a&gt; (Built with Violit 👈)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; &lt;a href="https://doc.violit.cloud/" rel="noopener noreferrer"&gt;doc.violit.cloud&lt;/a&gt; (Built with Violit 👈)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It supports &lt;strong&gt;Hybrid Rendering&lt;/strong&gt; (HTMX for large traffic, WebSocket for real-time) and can even be &lt;strong&gt;Desktop mode&lt;/strong&gt; using &lt;code&gt;pywebview&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Violit aims to go beyond being just another Streamlit alternative. Our goal is to enable developers to build complete web services (MVPs) entirely in Python.&lt;/p&gt;




&lt;h3&gt;
  
  
  🙏 Give it a try!
&lt;/h3&gt;

&lt;p&gt;I’m developing this in public, and it’s currently at &lt;strong&gt;v0.1.11&lt;/strong&gt;. It’s still early days, but the response from Reddit and the community has been amazing.&lt;/p&gt;

&lt;p&gt;If you are looking for a faster alternative to Streamlit for your dashboards or AI demos, please give it a try and let me know what you think!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/violit-dev/violit" rel="noopener noreferrer"&gt;github.com/violit-dev/violit&lt;/a&gt; (Stars make me happy! ⭐)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build Your Own Blog in 10 Minutes with Violit!:&lt;/strong&gt; &lt;a href="https://github.com/violit-dev/violit/blob/main/examples/2_violit_blog/README.md" rel="noopener noreferrer"&gt;Violit blog example&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading! Happy coding. 💜&lt;/p&gt;

</description>
      <category>python</category>
      <category>webdev</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>이런식으로 쓰면 될까</title>
      <dc:creator>Dope Flamingo</dc:creator>
      <pubDate>Sun, 23 May 2021 12:21:55 +0000</pubDate>
      <link>https://forem.com/dope_flamingo/-522a</link>
      <guid>https://forem.com/dope_flamingo/-522a</guid>
      <description>&lt;h1&gt;
  
  
  한번 써 보자
&lt;/h1&gt;

&lt;h2&gt;
  
  
  이런식으로
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
  </channel>
</rss>
