<?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: Rahul Anand</title>
    <description>The latest articles on DEV Community by Rahul Anand (@rahulnsanand).</description>
    <link>https://dev.to/rahulnsanand</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%2F400367%2F7956f94c-df3c-42a0-94dc-882c629528a4.jpeg</url>
      <title>DEV Community: Rahul Anand</title>
      <link>https://dev.to/rahulnsanand</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rahulnsanand"/>
    <language>en</language>
    <item>
      <title>A Tour of Papyra 1.0 in 20 Pictures</title>
      <dc:creator>Rahul Anand</dc:creator>
      <pubDate>Sun, 18 Oct 2026 20:03:01 +0000</pubDate>
      <link>https://dev.to/rahulnsanand/a-tour-of-papyra-10-in-20-pictures-3c9c</link>
      <guid>https://dev.to/rahulnsanand/a-tour-of-papyra-10-in-20-pictures-3c9c</guid>
      <description>&lt;p&gt;This is the short tour of &lt;a href="https://github.com/lyfie-org/papyra" rel="noopener noreferrer"&gt;Papyra&lt;/a&gt;, a notes app you run on your own server. Mostly pictures, very few words.&lt;/p&gt;

&lt;p&gt;Want to click along? There's a &lt;a href="https://papyra.app/demo" rel="noopener noreferrer"&gt;live demo&lt;/a&gt;. It's the real app with a fake backend, running in your browser. No sign-up.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The desk
&lt;/h2&gt;

&lt;p&gt;Notes are cards. Pin them, colour them, tag them, drag them around.&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%2Ffqdl9gegqzslyveqwmnn.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%2Ffqdl9gegqzslyveqwmnn.png" alt="The Papyra desk with pinned cards at the top and coloured cards below" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Light or dark
&lt;/h2&gt;

&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%2Feudlvo3do2eom150spez.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%2Feudlvo3do2eom150spez.gif" alt="GIF: the theme toggle flips the whole desk from light to dark and back" width="720" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Writing
&lt;/h2&gt;

&lt;p&gt;Click a card and it opens on top of the desk, so you never lose your place.&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%2Fs6226znp610hc6f57ano.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%2Fs6226znp610hc6f57ano.png" alt="A note open in the editor over the dimmed desk" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's no save button. Stop typing and it saves.&lt;/p&gt;

&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%2Fn3wryq6mh0e5cqop2cj1.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%2Fn3wryq6mh0e5cqop2cj1.gif" alt="GIF: typing a sentence; the footer shows " width="759" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Linking notes
&lt;/h2&gt;

&lt;p&gt;Type &lt;code&gt;[[&lt;/code&gt; and pick a note.&lt;/p&gt;

&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%2Fcsldvicc5i34h0fbypew.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%2Fcsldvicc5i34h0fbypew.gif" alt="GIF: typing two square brackets and " width="759" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every note shows what links to it at the bottom.&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%2Fsc3f15czts1e1vohvvr9.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%2Fsc3f15czts1e1vohvvr9.png" alt="The Revenue model note with a " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Finding things
&lt;/h2&gt;

&lt;p&gt;Ctrl+K searches titles, text, tags, and the text inside pictures (if you turn OCR on).&lt;/p&gt;

&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%2Fy3oz1pycdmn6dsqe6nkh.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%2Fy3oz1pycdmn6dsqe6nkh.gif" alt="GIF: search narrowing as " width="760" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. To-do lists
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkvy8elru5qwtcorrsv24.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%2Fkvy8elru5qwtcorrsv24.png" alt="The To Do page: Groceries and This week, with ticked and unticked items" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Tags and smart collections
&lt;/h2&gt;

&lt;p&gt;A smart collection is a saved rule, like "tagged work and pinned". Notes show up while they match.&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%2Fc2px8rx9964ecg626v7j.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%2Fc2px8rx9964ecg626v7j.png" alt="The Collections page with a " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Pictures and PDFs
&lt;/h2&gt;

&lt;p&gt;Drop files in. Pictures get thumbnails. PDFs open in place.&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%2Fesqbs3agny0uvn3q89vq.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%2Fesqbs3agny0uvn3q89vq.png" alt="A note with a large picture of a sourdough loaf" width="800" height="500"&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%2Fk220nu9nuu750ct7tkxr.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%2Fk220nu9nuu750ct7tkxr.png" alt="A note with a PDF previewed inline" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Going back in time
&lt;/h2&gt;

&lt;p&gt;Every note keeps its earlier versions. Step through them, see what changed, restore one.&lt;/p&gt;

&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%2Fc7d8oe8bi4fthoyi33c3.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%2Fc7d8oe8bi4fthoyi33c3.gif" alt="GIF: stepping back through versions of a reading list, then the Changes view" width="719" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Editing together
&lt;/h2&gt;

&lt;p&gt;Share a note with someone on your server and you can both type in it at once.&lt;/p&gt;

&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%2F5klecztgxwfuem1r3tff.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%2F5klecztgxwfuem1r3tff.gif" alt="GIF: two windows side by side, two people editing the same note with named cursors" width="760" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Comments
&lt;/h2&gt;

&lt;p&gt;Select text, comment on it, resolve it when it's done.&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%2F61xvu7mj0enu1qqmi12x.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%2F61xvu7mj0enu1qqmi12x.png" alt="A note with highlighted text and a comments panel with two threads" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Sharing
&lt;/h2&gt;

&lt;p&gt;Share with a person (view or edit), or make a link. Links can expire or stop after a number of views.&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%2Ffuq2xdwe57hlzho5yax5.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%2Ffuq2xdwe57hlzho5yax5.png" alt="The share dialog: add a person, or create a link with expiry and max views" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what someone sees when they open a link:&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%2Fkxnsfcdqvt3sl4nd424u.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%2Fkxnsfcdqvt3sl4nd424u.png" alt="A public, view-only shared note: " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Shared with me
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8f0fvenob1zif54l5dlp.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%2F8f0fvenob1zif54l5dlp.png" alt="The " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  14. Notifications
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnejt6n63q4xanc4qsmhl.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%2Fnejt6n63q4xanc4qsmhl.png" alt="The notifications tray showing two comments from Jun" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  15. The vault
&lt;/h2&gt;

&lt;p&gt;Lock a note and it's blurred everywhere. Your PIN (or fingerprint) opens it.&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%2Fi584muwksgf9zz3wmt60.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%2Fi584muwksgf9zz3wmt60.png" alt="The Vault page with two blurred locked notes" width="800" height="500"&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/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk99w36naj0of2ypbx7t2.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%2Fk99w36naj0of2ypbx7t2.gif" alt="GIF: typing the vault PIN on a locked note, which then opens" width="759" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  16. Offline
&lt;/h2&gt;

&lt;p&gt;No signal? Keep typing. It catches up when you're back.&lt;/p&gt;

&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%2Fto8a4w1ysbntmsc6697d.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%2Fto8a4w1ysbntmsc6697d.gif" alt="GIF: offline typing, " width="719" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  17. Sign-in
&lt;/h2&gt;

&lt;p&gt;Every account has an authenticator app. Passkeys and single sign-on work too.&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%2Fr9cr7c6qdz699wzf804k.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%2Fr9cr7c6qdz699wzf804k.png" alt="The sign-in screen with a " width="800" height="1209"&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%2F2mmj0nvmuj52dqzxgu2e.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%2F2mmj0nvmuj52dqzxgu2e.png" alt="The second step: " width="800" height="901"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  18. Security settings
&lt;/h2&gt;

&lt;p&gt;Authenticator apps, passkeys, the vault PIN, and every signed-in browser (which you can rename or sign out) live here.&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%2Fs24mzlcvfcge652ncpk1.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%2Fs24mzlcvfcge652ncpk1.png" alt="Settings, Security: authenticator app, passkeys and locked-note PIN" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  19. Data in and out
&lt;/h2&gt;

&lt;p&gt;Import from Obsidian or Google Keep. Export everything as plain Markdown in a zip.&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%2F4lw45s65cxferg9hcw0o.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%2F4lw45s65cxferg9hcw0o.png" alt="Settings, Data &amp;amp; Storage: import, export all notes, and an encrypted backup download" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  20. On your phone
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F64v2108z984c37equf4v.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%2F64v2108z984c37equf4v.png" alt="Papyra on a phone-sized screen" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the tour. The &lt;a href="https://papyra.app/demo" rel="noopener noreferrer"&gt;demo&lt;/a&gt; is the same app. Go break it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Rahul. I vibe-coded Papyra: what would have taken me a year or more to build by hand took a few months. It's GPLv3 and self-hosted: one Docker container, your notes as plain Markdown files.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/lyfie-org/papyra" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://papyra.app/demo" rel="noopener noreferrer"&gt;Live demo, no signup&lt;/a&gt; · &lt;a href="https://papyra.app/docs" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Papyra v1: Self-Hosted Notes That Are Just Markdown Files</title>
      <dc:creator>Rahul Anand</dc:creator>
      <pubDate>Thu, 15 Oct 2026 05:00:48 +0000</pubDate>
      <link>https://dev.to/rahulnsanand/papyra-v1-self-hosted-notes-that-are-just-markdown-files-42jk</link>
      <guid>https://dev.to/rahulnsanand/papyra-v1-self-hosted-notes-that-are-just-markdown-files-42jk</guid>
      <description>&lt;p&gt;Papyra 1.0 is out. It's a notes app you run on your own server. It looks like Google Keep, and every note is a plain &lt;code&gt;.md&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;That's the whole idea. The rest of this post is pictures.&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%2Ffqdl9gegqzslyveqwmnn.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%2Ffqdl9gegqzslyveqwmnn.png" alt="The Papyra desk: pinned and unpinned note cards in a warm, paper-coloured grid" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The desk. Cards you can pin, colour, tag and drag around.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The folder is the storage
&lt;/h2&gt;

&lt;p&gt;Every note is a Markdown file with a small YAML header. Here's one, straight off the disk:&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%2Fb3fzfwipzp8wredpwae0.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%2Fb3fzfwipzp8wredpwae0.png" alt="cat of a note file: YAML frontmatter with id, title, tags, colour, then the Markdown body with a table" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;No database blob. No export step. Just a file.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And here's the whole data folder. Your notes live in &lt;code&gt;users/1/notes/&lt;/code&gt;. Everything Papyra keeps for itself goes in a hidden &lt;code&gt;.papyra/&lt;/code&gt; folder.&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%2Fts715l362p46xy06nklb.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%2Fts715l362p46xy06nklb.png" alt="find listing of the data volume: users/1/notes/*.md, users/1/media, and hidden .papyra folders for caches" width="800" height="978"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There &lt;em&gt;is&lt;/em&gt; a SQLite database and a search index. They're caches. Delete them and Papyra rebuilds them from the files.&lt;/p&gt;
&lt;h2&gt;
  
  
  Other tools can edit your notes
&lt;/h2&gt;

&lt;p&gt;Because they're files, anything can change them. Papyra notices and catches up. Here I add a line to a to-do list from a shell, and the open app updates on its own:&lt;/p&gt;

&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%2Fgr0acayahwnfpc271e7b.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%2Fgr0acayahwnfpc271e7b.gif" alt="GIF: a shell appends a line to groceries.md and the Groceries list in the open app gains " width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A real command on the real file. No reload.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Point Obsidian at the folder and it opens. Write a new note in Obsidian and it shows up in Papyra. &lt;code&gt;grep&lt;/code&gt; works. Syncthing works. Git works.&lt;/p&gt;
&lt;h2&gt;
  
  
  What's in 1.0
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live editing together.&lt;/strong&gt; Share a note and two people can type in it at the same time, with named cursors. It's still a &lt;code&gt;.md&lt;/code&gt; file on disk.&lt;/p&gt;

&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%2F5klecztgxwfuem1r3tff.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%2F5klecztgxwfuem1r3tff.gif" alt="GIF: two browser windows side by side, Ana and Jun editing the same Lisbon trip note, each seeing the other's cursor and text appear" width="760" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fast full-text search.&lt;/strong&gt; Press Ctrl+K and type.&lt;/p&gt;

&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%2Fy3oz1pycdmn6dsqe6nkh.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%2Fy3oz1pycdmn6dsqe6nkh.gif" alt="GIF: typing " width="760" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links between notes.&lt;/strong&gt; Type &lt;code&gt;[[&lt;/code&gt; to link another note. Every note lists what links to it.&lt;/p&gt;

&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%2Fcsldvicc5i34h0fbypew.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%2Fcsldvicc5i34h0fbypew.gif" alt="GIF: typing two square brackets and " width="759" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version history.&lt;/strong&gt; Step back through earlier versions and see what changed.&lt;/p&gt;

&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%2Fc7d8oe8bi4fthoyi33c3.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%2Fc7d8oe8bi4fthoyi33c3.gif" alt="GIF: opening History on a reading list, stepping to an older version, then the Changes view with added and removed lines" width="719" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A vault for private notes.&lt;/strong&gt; Locked notes are blurred, open with a PIN (or your fingerprint), and are encrypted on disk.&lt;/p&gt;

&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%2Fk99w36naj0of2ypbx7t2.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%2Fk99w36naj0of2ypbx7t2.gif" alt="GIF: a locked " width="759" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comments.&lt;/strong&gt; Select text, leave a comment, resolve it later.&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%2F61xvu7mj0enu1qqmi12x.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%2F61xvu7mj0enu1qqmi12x.png" alt="A note with highlighted passages and a comments panel showing two open threads from Jun" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pictures and PDFs inside notes.&lt;/strong&gt; Drop them in. PDFs preview in place.&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%2Fk220nu9nuu750ct7tkxr.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%2Fk220nu9nuu750ct7tkxr.png" alt="A note with an attached PDF opened inline, showing a small table of figures" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Works offline.&lt;/strong&gt; Keep typing with no signal. It syncs when you're back.&lt;/p&gt;

&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%2Fto8a4w1ysbntmsc6697d.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%2Fto8a4w1ysbntmsc6697d.gif" alt="GIF: the network drops, a sentence is typed, the label says " width="719" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also in the box: two-step sign-in with an authenticator app, passkeys, single sign-on (OIDC), sharing by link, import from Obsidian and Google Keep, export to a zip, sealed backup files, and backup to a private GitHub repo.&lt;/p&gt;

&lt;p&gt;It works on phones, too.&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%2F64v2108z984c37equf4v.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%2F64v2108z984c37equf4v.png" alt="Papyra on a phone-sized screen, showing the desk" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;One container, one volume:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-O&lt;/span&gt; https://raw.githubusercontent.com/lyfie-org/papyra/main/docker-compose.hub.yml
docker compose &lt;span class="nt"&gt;-f&lt;/span&gt; docker-compose.hub.yml up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:8080&lt;/code&gt; and create the first account. That's it. The image is built for amd64 and arm64, so a Raspberry Pi 4 or 5 works too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Release Note
&lt;/h2&gt;

&lt;p&gt;1.0 means I use it every day and I'm happy for you to. It does not mean it's finished or bug-free. It makes backups for you: keep them.&lt;/p&gt;

&lt;p&gt;There's no hosted version and no native mobile app. There's an AI assistant in the code, but it's switched off for now.&lt;/p&gt;

&lt;p&gt;And if Papyra isn't for you, delete it. You still have a folder of Markdown files. That's the point.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Rahul. I vibe-coded Papyra: what would have taken me a year or more to build by hand took a few months. It's GPLv3 and self-hosted: one Docker container, your notes as plain Markdown files.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/lyfie-org/papyra" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://papyra.app/demo" rel="noopener noreferrer"&gt;Live demo, no signup&lt;/a&gt; · &lt;a href="https://papyra.app/docs" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>Luthor: A WYSIWYG React Text Editor for Performance and Control</title>
      <dc:creator>Rahul Anand</dc:creator>
      <pubDate>Thu, 12 Mar 2026 17:20:26 +0000</pubDate>
      <link>https://dev.to/rahulnsanand/luthor-a-wysiwyg-react-text-editor-for-performance-and-control-1m22</link>
      <guid>https://dev.to/rahulnsanand/luthor-a-wysiwyg-react-text-editor-for-performance-and-control-1m22</guid>
      <description>&lt;p&gt;I built Luthor to end the editor tradeoff: fast setup with lock-in, or full control that burns weeks before you ship anything real at scale.&lt;/p&gt;

&lt;p&gt;I just want to build my app! Not wonder what a toolbar icon should look like on the text editor.&lt;br&gt;
I wanted one ecosystem where I can ship fast, then go deep only when I actually need to.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://www.luthor.fyi" rel="noopener noreferrer"&gt;https://www.luthor.fyi&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Playground: &lt;a href="https://www.luthor.fyi/demo" rel="noopener noreferrer"&gt;https://www.luthor.fyi/demo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://www.luthor.fyi/docs/getting-started/index" rel="noopener noreferrer"&gt;https://www.luthor.fyi/docs/getting-started/index&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/lyfie-org/luthor" rel="noopener noreferrer"&gt;https://github.com/lyfie-org/luthor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm (&lt;code&gt;@lyfie/luthor&lt;/code&gt;): &lt;a href="https://www.npmjs.com/package/@lyfie/luthor" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@lyfie/luthor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm (&lt;code&gt;@lyfie/luthor-headless&lt;/code&gt;): &lt;a href="https://www.npmjs.com/package/@lyfie/luthor-headless" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@lyfie/luthor-headless&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The components that make Luthor
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Core - &lt;code&gt;@lyfie/luthor-headless&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Use this when you want full editor UI control.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;runtime dependencies: &lt;strong&gt;0&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;core engine and related packages are exposed via &lt;code&gt;peerDependencies&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;you choose exactly what to install and what to customize&lt;/li&gt;
&lt;li&gt;you build your own UI/UX, toolbar, behavior, and design-system integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This package is lean by design. Performant by intention.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Showoff - &lt;code&gt;@lyfie/luthor&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Use this when you want one-package-solution, shipping speed with polished defaults, this package does not bloat your application, it depends ONLY on Lexical packages and The Core &lt;code&gt;@lyfie/luthor-headless&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;includes the Lexical package set it needs under the hood&lt;/li&gt;
&lt;li&gt;gives you presets out of the box, just plug and play&lt;/li&gt;
&lt;li&gt;includes and exposes all extensibility of &lt;code&gt;@lyfie/luthor-headless&lt;/code&gt; under the hood&lt;/li&gt;
&lt;li&gt;still lets you move into deeper customization when needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the practical all-in-one lane.&lt;br&gt;&lt;br&gt;
QYSIQYG/WYSIWYG style, but without losing the escape hatch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance at a glance
&lt;/h2&gt;

&lt;p&gt;Both packages are built for fast, responsive editing in real apps.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@lyfie/luthor&lt;/code&gt; is intentionally super lightweight for a ready-to-ship WYSIWYG package.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@lyfie/luthor-headless&lt;/code&gt; is even more lightweight, since it keeps runtime dependencies at zero and relies on peer dependencies for composition.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tree-Shaking
&lt;/h2&gt;

&lt;p&gt;Tree-shaking helps keep shipped code lean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;headless is especially tree-shake friendly because it is ESM and marks &lt;code&gt;sideEffects: false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;preset package also tree-shakes JS imports, while stylesheet imports stay intentional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result: you can avoid dragging unnecessary editor code into production bundles, keeping your final build as lean as possible on the users browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features Developers Might Love (I know I do)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Writing + structure that feels solid
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;typography controls&lt;/li&gt;
&lt;li&gt;formatting essentials&lt;/li&gt;
&lt;li&gt;links, headings, alignment, and list workflows&lt;/li&gt;
&lt;/ul&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%2Fpkha1xuiktuajuihc9cm.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%2Fpkha1xuiktuajuihc9cm.gif" alt="Typography and formatting" width="760" height="427"&gt;&lt;/a&gt;&lt;br&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%2Fezcytj86m5nlcutv6hmz.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%2Fezcytj86m5nlcutv6hmz.gif" alt="Links and structure" width="760" height="427"&gt;&lt;/a&gt;&lt;br&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%2Fkhy8fkcgprlyx5rsh582.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%2Fkhy8fkcgprlyx5rsh582.gif" alt="Lists and structure" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Productivity without friction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;slash command center&lt;/li&gt;
&lt;li&gt;command workflows&lt;/li&gt;
&lt;li&gt;undo/redo and keyboard-first speed&lt;/li&gt;
&lt;/ul&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%2Fzprn2dx4geg2c7zvqqt6.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%2Fzprn2dx4geg2c7zvqqt6.gif" alt="Slash commands" width="800" height="450"&gt;&lt;/a&gt;&lt;br&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%2F5zm6cbau7bdh1pqtfao9.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%2F5zm6cbau7bdh1pqtfao9.gif" alt="History and shortcuts" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Real product features, not just demo features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;embeds (image, iframe, YouTube)&lt;/li&gt;
&lt;li&gt;code blocks&lt;/li&gt;
&lt;li&gt;custom blocks and extension-level flexibility&lt;/li&gt;
&lt;li&gt;dark/light ready behavior&lt;/li&gt;
&lt;/ul&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%2F8efg0bzr6r89st2yxrur.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%2F8efg0bzr6r89st2yxrur.gif" alt="Embeds and media" width="80" height="45"&gt;&lt;/a&gt;&lt;br&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%2F3ms7ki8d2v1jqbebej15.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%2F3ms7ki8d2v1jqbebej15.gif" alt="Code blocks" width="760" height="427"&gt;&lt;/a&gt;&lt;br&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%2Fokffk64wfxlsloh7x0h3.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%2Fokffk64wfxlsloh7x0h3.gif" alt="Custom blocks" width="760" height="427"&gt;&lt;/a&gt;&lt;br&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%2F8xq9tqxpp56waglxok7d.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%2F8xq9tqxpp56waglxok7d.gif" alt="Theme support" width="600" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Minimal Setup: Preset Lane
&lt;/h2&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; @lyfie/luthor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ExtensiveEditor&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;@lyfie/luthor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@lyfie/luthor/styles.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ExtensiveEditor&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Start writing..."&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Minimal Setup: Headless Lane
&lt;/h2&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; @lyfie/luthor-headless
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;lexical @lexical/code @lexical/link @lexical/list @lexical/markdown @lexical/react @lexical/rich-text @lexical/selection @lexical/table @lexical/utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;createEditorSystem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;RichText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;richTextExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;boldExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;italicExtension&lt;/span&gt;&lt;span class="p"&gt;,&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;@lyfie/luthor-headless&lt;/span&gt;&lt;span class="dl"&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;extensions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;richTextExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;boldExtension&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;italicExtension&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&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;Provider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEditor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;createEditorSystem&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;extensions&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;function&lt;/span&gt; &lt;span class="nf"&gt;Toolbar&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;activeStates&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useEditor&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;button&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="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toggleBold&lt;/span&gt;&lt;span class="p"&gt;?.()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;aria-pressed&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activeStates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bold&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Bold
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&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;button&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="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toggleItalic&lt;/span&gt;&lt;span class="p"&gt;?.()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;aria-pressed&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activeStates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;italic&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Italic
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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="nc"&gt;Provider&lt;/span&gt; &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;extensions&lt;/span&gt;&lt;span class="si"&gt;}&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="nc"&gt;Toolbar&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="nc"&gt;RichText&lt;/span&gt; &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Write here..."&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="nc"&gt;Provider&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why Developers Stick With It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;clear split between preset workflow and headless workflow&lt;/li&gt;
&lt;li&gt;practical docs for getting started, presets, architecture, and API usage&lt;/li&gt;
&lt;li&gt;live playground to evaluate flows before integration&lt;/li&gt;
&lt;li&gt;feature depth that covers real product requirements, not just demos&lt;/li&gt;
&lt;li&gt;developer-first approach: open source, MIT, no paywalls&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Take
&lt;/h2&gt;

&lt;p&gt;If you want a clean editor stack with zero confusion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;choose &lt;code&gt;@lyfie/luthor-headless&lt;/code&gt; for maximum UI/UX control and lean dependency strategy&lt;/li&gt;
&lt;li&gt;choose &lt;code&gt;@lyfie/luthor&lt;/code&gt; for all the built in presets for fast QYSIQYG/WYSIWYG plug and play shipping and built-in ergonomics (bonus: you get luthor-headless features within this package too, best of both worlds)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Either way, you stay in one ecosystem and scale without redoing everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Links (Again)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://www.luthor.fyi" rel="noopener noreferrer"&gt;https://www.luthor.fyi&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Playground: &lt;a href="https://www.luthor.fyi/demo" rel="noopener noreferrer"&gt;https://www.luthor.fyi/demo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://www.luthor.fyi/docs/getting-started/index" rel="noopener noreferrer"&gt;https://www.luthor.fyi/docs/getting-started/index&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/lyfie-org/luthor" rel="noopener noreferrer"&gt;https://github.com/lyfie-org/luthor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm (&lt;code&gt;@lyfie/luthor&lt;/code&gt;): &lt;a href="https://www.npmjs.com/package/@lyfie/luthor" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@lyfie/luthor&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm (&lt;code&gt;@lyfie/luthor-headless&lt;/code&gt;): &lt;a href="https://www.npmjs.com/package/@lyfie/luthor-headless" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@lyfie/luthor-headless&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>lexical</category>
      <category>lowcode</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
