<?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: zohayr slileh</title>
    <description>The latest articles on DEV Community by zohayr slileh (@zohayr_slileh_6e6ee4a17c8).</description>
    <link>https://dev.to/zohayr_slileh_6e6ee4a17c8</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%2F4111781%2Fca41638b-ca2c-4074-9ada-cf669dfb4e0e.png</url>
      <title>DEV Community: zohayr slileh</title>
      <link>https://dev.to/zohayr_slileh_6e6ee4a17c8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zohayr_slileh_6e6ee4a17c8"/>
    <language>en</language>
    <item>
      <title>Chalkboard and avatar for ai agents</title>
      <dc:creator>zohayr slileh</dc:creator>
      <pubDate>Sun, 04 Oct 2026 03:04:37 +0000</pubDate>
      <link>https://dev.to/zohayr_slileh_6e6ee4a17c8/chalkboard-and-avatar-for-ai-agents-4nej</link>
      <guid>https://dev.to/zohayr_slileh_6e6ee4a17c8/chalkboard-and-avatar-for-ai-agents-4nej</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4dv68dz5lo8txai0bqqb.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4dv68dz5lo8txai0bqqb.gif" alt=" " width="720" height="392"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fncuvkzjvcukibzn32i6j.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fncuvkzjvcukibzn32i6j.png" alt=" " width="799" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because I find it difficult to read the textual output of agents after each modification or planning, and relate everything to the big picture, I built this simple application (with the help of Claude Code).&lt;/p&gt;

&lt;p&gt;It is an Electron application that has an integrated terminal linked to the Chalkboard. Any agent you run in this terminal can use it and express its textual outputs in graphics that are easier to review.&lt;/p&gt;

&lt;p&gt;Some may find the sounds a little annoying, but it's just an adjustable option, which I prefer.&lt;/p&gt;

&lt;p&gt;Using it may cause a bit more token consumption or subscription quota, but in my experience with Claude Code I haven't seen a noticeable difference.&lt;/p&gt;

&lt;p&gt;In general, the project is open source for anyone who wants to try it or modify it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/zohayrslileh/more-space" rel="noopener noreferrer"&gt;https://github.com/zohayrslileh/more-space&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I spent six months building PhreshOS, an open-source system for web apps</title>
      <dc:creator>zohayr slileh</dc:creator>
      <pubDate>Fri, 02 Oct 2026 08:57:04 +0000</pubDate>
      <link>https://dev.to/zohayr_slileh_6e6ee4a17c8/i-spent-six-months-building-phreshos-an-open-source-system-for-web-apps-2ppd</link>
      <guid>https://dev.to/zohayr_slileh_6e6ee4a17c8/i-spent-six-months-building-phreshos-an-open-source-system-for-web-apps-2ppd</guid>
      <description>&lt;p&gt;Hello everyone, I want to share my experience over the past six months building an open-source web application system (with the help of Cloud Code and Codex). The system is real, not just a UI; everything you see here was built as an application on top of the system and is not part of it. Plus, it continues to work even if you close the browser (unlike Puter, for example).&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8s2nlmkewij1lilyf65e.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8s2nlmkewij1lilyf65e.png" alt=" " width="800" height="427"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fst8mpqp97xb2b858bxdx.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fst8mpqp97xb2b858bxdx.png" alt=" " width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;source&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/PhreshOS/system" rel="noopener noreferrer"&gt;https://github.com/PhreshOS/system&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;demo (around 5 people at a time, if it's full there's a timer)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.phreshos.com/" rel="noopener noreferrer"&gt;https://demo.phreshos.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;docs&lt;/p&gt;

&lt;p&gt;&lt;a href="https://phreshos.com/docs" rel="noopener noreferrer"&gt;https://phreshos.com/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;how can I benefit from it? I build all my own tools on top of it, thus benefiting from remote access, a single authentication system, and communication. All I write is the business logic and how the interface will look. Any AI agent can access and use this application without me having to build a custom interface for it.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI is no longer just a tool.</title>
      <dc:creator>zohayr slileh</dc:creator>
      <pubDate>Fri, 02 Oct 2026 01:54:34 +0000</pubDate>
      <link>https://dev.to/zohayr_slileh_6e6ee4a17c8/ai-is-no-longer-just-a-tool-124g</link>
      <guid>https://dev.to/zohayr_slileh_6e6ee4a17c8/ai-is-no-longer-just-a-tool-124g</guid>
      <description>&lt;p&gt;Many people still cling to the idea that artificial intelligence is merely a tool in the hands of the developer (this definition might have been acceptable a year or two ago), but the situation is different now. To demonstrate that it's more than just a tool, let's define the concept of a tool.&lt;/p&gt;

&lt;p&gt;A tool is an extension of humanity itself; every action it takes stems from human action, and the quality of its results is directly linked to the quality of its use. It will typically malfunction or become less useful if it deviates from its intended purpose.&lt;/p&gt;

&lt;p&gt;However, when a tool becomes capable of reframing the problem it solves, changing the direction of the solution itself, or perhaps even redefining the framework, the gap between the user's objective and the nature of the outcome begins to widen. I'm not claiming that AI will be able to act autonomously, but the need for precise guidance is diminishing daily.&lt;/p&gt;

&lt;p&gt;Remember GPT-3? How bad it was at writing even the simplest code! It required at least three attempts to get it working. Aside from the training mechanisms and technologies that have evolved, the most crucial thing it lacked was data itself. The internet today is full of tutorials on how to use AI and get the best results, but what we often overlook is that AI itself learns from this knowledge and follows these methods and rules on its own.&lt;/p&gt;

&lt;p&gt;For example, in the past, when you asked one model to write a prompt for another, it would often be confused because it didn't understand what those prompts meant or what it meant to instruct a language model. These concepts simply weren't part of its training. The same applies to things AI doesn't know today; it simply hasn't had enough exposure to them.&lt;/p&gt;

&lt;p&gt;Therefore, in any course that teaches you how to do things AI can't do, remember that you and AI are, at this moment, classmates.&lt;/p&gt;

&lt;p&gt;That's why I see AI today as more than just a tool; it's more like a partner, at least for now.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
    </item>
    <item>
      <title>I spent 6 months building a real operating system for web apps</title>
      <dc:creator>zohayr slileh</dc:creator>
      <pubDate>Wed, 30 Sep 2026 16:26:15 +0000</pubDate>
      <link>https://dev.to/zohayr_slileh_6e6ee4a17c8/i-spent-6-months-building-a-real-operating-system-for-web-apps-179k</link>
      <guid>https://dev.to/zohayr_slileh_6e6ee4a17c8/i-spent-6-months-building-a-real-operating-system-for-web-apps-179k</guid>
      <description>&lt;p&gt;For the last six months or so I've been building something a bit unusual: a real operating system for web apps.&lt;/p&gt;

&lt;p&gt;It's called PhreshOS. It's open source (MIT), and you can try a live demo right now: &lt;a href="https://demo.phreshos.com/" rel="noopener noreferrer"&gt;https://demo.phreshos.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I want to explain what it is, because "OS for web apps" can mean a lot of things.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiohh7x5vjhvsey8enfan.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiohh7x5vjhvsey8enfan.png" alt=" " width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;PhreshOS is a programmable system that runs on your machine, with a desktop you open in the browser. You can reach it from anywhere you can reach your machine.&lt;/p&gt;

&lt;p&gt;The apps on it (I call them Programs) are built with normal web tools. TypeScript, React if you want it, Vite, whatever you already use.&lt;/p&gt;

&lt;p&gt;The difference is &lt;strong&gt;where&lt;/strong&gt; you build them. You build a Program inside the System, and the System takes care of the parts every app has to redo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sign-in and sessions&lt;/li&gt;
&lt;li&gt;communication between the app's parts, and between apps&lt;/li&gt;
&lt;li&gt;windows, storage, permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So you only write the app's own logic.&lt;/p&gt;

&lt;p&gt;And everything you see on the desktop is a Program built on top of the System. The file manager, the settings, the wallpaper. None of it is baked into the core.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Program looks like
&lt;/h2&gt;

&lt;p&gt;A Program has two sides: a &lt;strong&gt;Server&lt;/strong&gt; that runs in the background, and a &lt;strong&gt;Client&lt;/strong&gt; that shows up in a window.&lt;/p&gt;

&lt;p&gt;Here's the counter you get when you create a new Program. The Server keeps the count:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;context&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="s2"&gt;@phreshos/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;read&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="o"&gt;=&amp;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;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;increment&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;changed&lt;/span&gt;&lt;span class="dl"&gt;"&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="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Client asks for it, and follows the changes:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;context&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="s2"&gt;@phreshos/client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ask&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;read&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;changed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;increment&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;



&lt;p&gt;That's it. No HTTP routes, no WebSocket setup, no auth middleware. &lt;code&gt;ask&lt;/code&gt; gets one answer, &lt;code&gt;publish&lt;/code&gt; announces something, &lt;code&gt;subscribe&lt;/code&gt; listens. The same three work between the two sides of a Program, between Programs, and from outside.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built for agents first
&lt;/h2&gt;

&lt;p&gt;This is the part I care about most.&lt;/p&gt;

&lt;p&gt;On most systems, when an AI agent needs to use an app, it has to drive a browser and click buttons that were designed for eyes. Or someone writes a separate API just for the agent.&lt;/p&gt;

&lt;p&gt;In PhreshOS, an agent uses the same apps you do, directly. The &lt;code&gt;phresh&lt;/code&gt; command line reaches the whole running System, not just the install. So the agent you already use in your terminal can do things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;phresh program list &lt;span class="nt"&gt;--json&lt;/span&gt;                  &lt;span class="c"&gt;# what's installed&lt;/span&gt;
phresh process create &lt;span class="nt"&gt;--program&lt;/span&gt; files &lt;span class="nt"&gt;--name&lt;/span&gt; main   &lt;span class="c"&gt;# open an app, its window appears on your desktop&lt;/span&gt;
phresh window maximize &lt;span class="nt"&gt;--process&lt;/span&gt; main &lt;span class="nt"&gt;--program&lt;/span&gt; files
phresh system logs &lt;span class="nt"&gt;--statement&lt;/span&gt; &lt;span class="s2"&gt;"select level, content from logs order by createdAt desc limit 10"&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it can call an app's features, the same ones the app's window uses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;phresh endpoint ask &lt;span class="nt"&gt;--program&lt;/span&gt; notes &lt;span class="nt"&gt;--process&lt;/span&gt; main &lt;span class="nt"&gt;--endpoint&lt;/span&gt; server &lt;span class="nt"&gt;--event&lt;/span&gt; notes.list &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't design a special interface for the agent. If a feature exists for the window, it exists for the agent. &lt;code&gt;phresh describe --all --json&lt;/code&gt; gives the agent every command as data, so it can find its own way around.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;You need Node.js 24.15 or newer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--global&lt;/span&gt; @phreshos/cli
phresh system &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open the address it prints (usually &lt;code&gt;http://localhost:4300&lt;/code&gt;) and create your account. You can also run it in a GitHub Codespace.&lt;/p&gt;

&lt;p&gt;To build your first Program:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;phresh create my-program
&lt;span class="nb"&gt;cd &lt;/span&gt;my-program
phresh dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its window opens on your desktop.&lt;/p&gt;

&lt;p&gt;I've tested it on macOS and Linux. Windows, honestly, I don't know yet. If you try it there, I'd love to hear how it goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/PhreshOS/system" rel="noopener noreferrer"&gt;https://github.com/PhreshOS/system&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://phreshos.com/docs" rel="noopener noreferrer"&gt;https://phreshos.com/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo: &lt;a href="https://demo.phreshos.com/" rel="noopener noreferrer"&gt;https://demo.phreshos.com/&lt;/a&gt; (it handles about 5 sessions at once, so if it's full, try again in a bit)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's still early, and there's a lot I want to build on top of it. Any feedback helps, good or bad.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Lumiana — building personal apps with browser and Node.js APIs together</title>
      <dc:creator>zohayr slileh</dc:creator>
      <pubDate>Sun, 06 Sep 2026 02:11:46 +0000</pubDate>
      <link>https://dev.to/zohayr_slileh_6e6ee4a17c8/lumiana-building-personal-apps-with-browser-and-nodejs-apis-together-16eb</link>
      <guid>https://dev.to/zohayr_slileh_6e6ee4a17c8/lumiana-building-personal-apps-with-browser-and-nodejs-apis-together-16eb</guid>
      <description>&lt;p&gt;I've been working on Lumiana because I wanted to write a personal app's UI and logic together, without building a separate API just to connect them.&lt;/p&gt;

&lt;p&gt;It works with Vite. You connect to the Node server with credentials first, then use Node imports alongside your UI code. JavaScript stays in the browser where possible, while operations that need the operating system run on the server.&lt;/p&gt;

&lt;p&gt;After connecting, a small example looks like this:&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;platform&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;node:os&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Connected to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; on &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is to use existing Node libraries as they are, without changing them or writing compatibility code for each package.&lt;/p&gt;

&lt;p&gt;I've had examples running with Express, Hono, Elysia, Sharp, node-pty, and sqlite3, but it's still early. Most libraries I've tried don't work normally yet, so there's a lot left to do.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/zohayrslileh/lumiana" rel="noopener noreferrer"&gt;GitHub project and setup instructions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>node</category>
      <category>vite</category>
    </item>
  </channel>
</rss>
