<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/_style/default.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>English — lepture</title><description>Notes on programming, open source, books, travel, and everyday life.</description><link>https://lepture.com/</link><language>en</language><atom:link href="https://lepture.com/en/feed.xml" rel="self" type="application/rss+xml"/><image><url>https://lepture.com/avatar.jpg</url><title>lepture</title><link>https://lepture.com/</link></image><item><title>Building Prosefly</title><link>https://lepture.com/blog/building-prosefly</link><guid isPermaLink="true">https://lepture.com/blog/building-prosefly</guid><description>Why I started Prosefly, what I built first, and a wrong turn with Cloudflare.</description><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;why-build-another-one&quot;&gt;Why build another one?&lt;/h2&gt;
&lt;p&gt;I had already built Typlog. Why start &lt;a href=&quot;/projects/prosefly&quot;&gt;Prosefly&lt;/a&gt; too? I think static websites make more sense now, especially with AI. 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.&lt;/p&gt;
&lt;p&gt;How content is stored and how I write it are two separate things, though. I still want a friendly visual editor. Formatting and inserting images feel more comfortable there; I don’t want to edit source every time.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id=&quot;development-order&quot;&gt;Development order&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 org, made several Astro themes and templates, and then started building the Prosefly platform.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id=&quot;a-wrong-turn&quot;&gt;A wrong turn&lt;/h2&gt;
&lt;p&gt;The platform runs on Cloudflare Workers and needs to keep data separate for each org. I initially chose &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/&quot;&gt;Workers for Platforms&lt;/a&gt;. It lets a platform deploy and run users’ Worker code, but my main need at that point was to separate data between organizations.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Later, I realized that &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt; could handle the data separation I needed. Each org’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.&lt;/p&gt;</content:encoded></item></channel></rss>