{"version":"https://jsonfeed.org/version/1.1","title":"English — lepture","description":"Notes on programming, open source, books, travel, and everyday life.","home_page_url":"https://lepture.com/","feed_url":"https://lepture.com/en/feed.json","icon":"https://lepture.com/avatar.jpg","language":"en","items":[{"id":"https://lepture.com/blog/building-prosefly","url":"https://lepture.com/blog/building-prosefly","title":"Building Prosefly","summary":"Why I started Prosefly, what I built first, and a wrong turn with Cloudflare.","content_html":"<p>I run <a href=\"/projects/typlog\">Typlog</a>, a hosting platform for blogs and podcasts. Recently, I started a new project, <a href=\"/projects/prosefly\">Prosefly</a>. It lets you manage documents and articles in a GitHub repository and write with a visual editor.</p>\n<h2 id=\"why-build-another-one\">Why build another one?</h2>\n<p>I had already built <a href=\"https://typlog.com\">Typlog</a>. Why start <a href=\"https://prosefly.com\">Prosefly</a> too? This is a golden age for static websites: AI has made them much easier to build. When content lives in Markdown and MDX files alongside the website’s code, AI can read and edit it directly, and work on articles and pages together.</p>\n<p>Storing data in files and writing articles are two separate things, though. I still want a friendly visual editor. Formatting and inserting images feel more comfortable there, so I don’t have to edit source every time.</p>\n<p>AI has also made it easier to build your own theme. You can change the website to suit your ideas and define its frontmatter fields along with it. For a book review, for example, you could add an author and a rating to the schema.</p>\n<p>In Typlog, those fields are predefined by me and are not easy for users to change. Prosefly reads the frontmatter schema defined in the project’s text files and generates the editing interface from it. When making a new template, I don’t have to start by checking whether the platform supports the fields I want.</p>\n<h2 id=\"development-order\">Development order</h2>\n<p>I spent a long time designing the visual editor before starting the complete platform. Most of my attention was on the editor: the files would be Markdown and MDX, but I wanted a visual writing experience. I wanted that part to be mostly ready first.</p>\n<figure class=\"pf-video-player\" data-astro-cid-r4k5drvp><pf-video-player class=\"not-prose\" data-short-video-seconds=\"30\" data-astro-cid-r4k5drvp=\"true\"><video src=\"https://media.prosefly.com/lepture/0b908530761a489bb3e17f2116775092.mp4\" controls playsinline preload=\"metadata\" aria-label=\"Visual Editor by Prosefly\"></video><div class=\"pf-video-player__actions\" data-pf-video-actions hidden data-astro-cid-r4k5drvp><button type=\"button\" class=\"pf-video-player__button\" data-pf-video-playback data-play-label=\"Play\" data-pause-label=\"Pause\" aria-label=\"Play\" title=\"Play\" data-astro-cid-r4k5drvp><svg class=\"pf-icon\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" data-pf-video-icon=\"play\" data-astro-cid-r4k5drvp=\"true\" aria-hidden=\"true\" focusable=\"false\" data-astro-cid-af3dxg6y><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><svg class=\"pf-icon\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" data-pf-video-icon=\"pause\" data-pf-video-hidden=\"true\" data-astro-cid-r4k5drvp=\"true\" aria-hidden=\"true\" focusable=\"false\" data-astro-cid-af3dxg6y><g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"><rect width=\"5\" height=\"18\" x=\"14\" y=\"3\" rx=\"1\"/><rect width=\"5\" height=\"18\" x=\"5\" y=\"3\" rx=\"1\"/></g></svg></button><button type=\"button\" class=\"pf-video-player__button\" data-pf-video-sound data-mute-label=\"Mute\" data-unmute-label=\"Unmute\" aria-label=\"Unmute\" title=\"Unmute\" hidden data-astro-cid-r4k5drvp><svg class=\"pf-icon\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" data-pf-video-icon=\"muted\" data-astro-cid-r4k5drvp=\"true\" aria-hidden=\"true\" focusable=\"false\" data-astro-cid-af3dxg6y><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11 4.702a.7.7 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.7.7 0 0 0 11 19.298zm5.5 9.798l5-5m-5 0l5 5\"/></svg><svg class=\"pf-icon\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" data-pf-video-icon=\"audible\" data-pf-video-hidden=\"true\" data-astro-cid-r4k5drvp=\"true\" aria-hidden=\"true\" focusable=\"false\" data-astro-cid-af3dxg6y><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298zM16 9a5 5 0 0 1 0 6m3.364 3.364a9 9 0 0 0 0-12.728\"/></svg></button></div></pf-video-player><figcaption>Visual Editor by Prosefly</figcaption></figure>\n<p>Once the editor was close to complete, I started working on Prosefly. Even then, I did not jump straight into the web app. I created a GitHub organization, made several Astro themes and templates, and then started building the Prosefly platform.</p>\n<p>Working on templates first gave me actual websites in which to organize content, define frontmatter, and see how the editor fit. By the time I started the platform, I already had content to edit and websites that used it.</p>\n<h2 id=\"a-mistake-i-made\">A mistake I made</h2>\n<p>I’m building Prosefly with Cloudflare Workers and need to isolate each organization’s data. I initially chose <a href=\"https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/\">Workers for Platforms</a>. It can deploy and run users’ Worker code, and it can provide that data separation too.</p>\n<p>The project became much more complicated. I had already spent a lot of time on the editor and made several templates, but building the platform kept getting harder. At one point, I considered giving up.</p>\n<p>Later, I realized that <a href=\"https://developers.cloudflare.com/durable-objects/\">Durable Objects</a> could handle the data separation I needed. Each organization’s data could live in its own Durable Object. It would still be one application, without deploying and managing separate Workers for that purpose. Switching to this approach made the platform much simpler, and I kept going.</p>","date_published":"2026-10-11T00:00:00.000Z","language":"en","tags":["Prosefly"]}]}