[{"data":1,"prerenderedAt":25},["ShallowReactive",2],{"blog:i-rebuilt-discord-six-times":3},{"title":4,"description":5,"date":6,"author":7,"url":8,"markdownPath":9,"html":10,"toc":11},"I built an open-source Discord alternative six times. Surely this one is different.","A personal history of chat apps, changing architectures, increasingly ambitious names and the suspiciously persistent urge to build one more Server.","2026-10-18","Inchi","\u002Fblog\u002Fi-rebuilt-discord-six-times","\u002Fblog\u002Fi-rebuilt-discord-six-times.md","\u003Cp>At some point, a reasonable person building an open-source Discord alternative finishes one and moves on.\u003C\u002Fp>\n\u003Cp>I have apparently chosen a different path.\u003C\u002Fp>\n\u003Cp>There was Ark. There was Trailcord. There was Anycord. There was Discoflare. There was OpenCord. And now there is L4.\u003C\u002Fp>\n\u003Cp>Depending on how you count prototypes, repositories and abandoned ideas, “six times” is either accurate or a conservative estimate. I have stopped counting browser tabs for the same reason.\u003C\u002Fp>\n\u003Ch2 id=\"it-starts-innocently\">\u003Ca class=\"heading-anchor\" href=\"#it-starts-innocently\">It starts innocently\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>The first idea always sounds manageable: “What if we made a community app?”\u003C\u002Fp>\n\u003Cp>There are channels. People send messages. Maybe a sidebar. You can practically see the finished product.\u003C\u002Fp>\n\u003Cp>Then someone asks about private channels.\u003C\u002Fp>\n\u003Cp>Then someone asks where the files live. Then whether a person removed from a channel can still download an old attachment. Then what happens if the Server restarts while two people are sending messages. Then how you back it up.\u003C\u002Fp>\n\u003Cp>The sidebar is still there. It is now surrounded by a database, a permissions model and a deeply personal relationship with error logs.\u003C\u002Fp>\n\u003Ch2 id=\"each-version-had-a-theory\">\u003Ca class=\"heading-anchor\" href=\"#each-version-had-a-theory\">Each version had a theory\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Ark wasn&#39;t just chat. It wanted to be a whole world for communities, and it kept growing new concepts faster than I could finish the old ones. Nothing says “simple messaging app” quite like a scope that grows every weekend.\u003C\u002Fp>\n\u003Cp>Trailcord was the opposite reaction: a self-hosted, Discord-shaped team chat for one community, kept deliberately small. Small is a wonderful plan until the second feature request arrives.\u003C\u002Fp>\n\u003Cp>Anycord tried yet another shape, with more than one community in a single installation. At this point I had apparently decided that making one chat server was not enough; I should also decide what a server means.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fvnmtvlv\u002Fdiscoflare\" rel=\"noopener\">Discoflare\u003C\u002Fa> brought the workspace into a Cloudflare account, alongside Tasks, Mail, Data, Apps and Agents. It asked how much of a community&#39;s workspace could live together on infrastructure the operator controls. Also, it had the best name for a nightclub that serves HTTP requests.\u003C\u002Fp>\n\u003Cp>OpenCord was another run at the same idea. The details changed; the pull of an open community workspace did not.\u003C\u002Fp>\n\u003Cp>These projects weren&#39;t necessarily a neat sequence of six clean rewrites. Some asked different questions, some had broader ambitions, and some overlapped. The recurring cast, however, was unmistakable: people, conversations, permissions, storage, and me opening another terminal.\u003C\u002Fp>\n\u003Ch2 id=\"and-then-there-was-l4\">\u003Ca class=\"heading-anchor\" href=\"#and-then-there-was-l4\">And then there was L4\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>L4 is the current attempt: one workspace for humans and agents, open source, running on your own Cloudflare account or your own server. Each Server owns its Accounts, Members and content. The optional Shell helps navigate between Servers; a bookmark is not membership. Conversation sits alongside Tasks, Data, Mail and Agents, with separate permissions and provider setup where needed.\u003C\u002Fp>\n\u003Cp>The important part is not that it has more nouns. It is that I keep coming back to the same question: can a community have a useful place to work together without giving up control of that place?\u003C\u002Fp>\n\u003Cp>The answer is harder than drawing a familiar chat interface. It includes installation, updates, backups, recovery, access checks and all the things that do not fit in a launch screenshot. L4 still has plenty of testing ahead on real Servers and real devices. The earlier projects taught me plenty; they did not grant me a magical exemption from testing this one.\u003C\u002Fp>\n\u003Ch2 id=\"will-i-build-a-seventh\">\u003Ca class=\"heading-anchor\" href=\"#will-i-build-a-seventh\">Will I build a seventh?\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>I would love to tell you no. I have a roadmap, documentation and a perfectly reasonable desire to finish what is in front of me.\u003C\u002Fp>\n\u003Cp>But if you ever see a new repository called \u003Ccode>definitely-not-another-cord\u003C\u002Fcode>, please mind your own business. I am probably investigating a very important question about database boundaries.\u003C\u002Fp>\n",[12,16,19,22],{"id":13,"text":14,"depth":15},"it-starts-innocently","It starts innocently",2,{"id":17,"text":18,"depth":15},"each-version-had-a-theory","Each version had a theory",{"id":20,"text":21,"depth":15},"and-then-there-was-l4","And then there was L4",{"id":23,"text":24,"depth":15},"will-i-build-a-seventh","Will I build a seventh?",1793335826830]