<?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: Nikita Chirov</title>
    <description>The latest articles on DEV Community by Nikita Chirov (@chirov).</description>
    <link>https://dev.to/chirov</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%2F4218107%2Fa7b3f801-54f2-446e-b04f-16b4a3d30847.jpg</url>
      <title>DEV Community: Nikita Chirov</title>
      <link>https://dev.to/chirov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chirov"/>
    <language>en</language>
    <item>
      <title>When Should You Replace Open-Source Real-Time Infrastructure? Lessons from Building LO</title>
      <dc:creator>Nikita Chirov</dc:creator>
      <pubDate>Sat, 31 Oct 2026 01:26:59 +0000</pubDate>
      <link>https://dev.to/chirov/when-should-you-replace-open-source-real-time-infrastructure-lessons-from-building-lo-5157</link>
      <guid>https://dev.to/chirov/when-should-you-replace-open-source-real-time-infrastructure-lessons-from-building-lo-5157</guid>
      <description>&lt;p&gt;&lt;em&gt;After eight years of building a social platform, we learned that the hardest infrastructure decision isn't choosing a technology. It's knowing when that technology no longer fits your product.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My name is &lt;strong&gt;Nikita Chirov&lt;/strong&gt;, and I'm the founder of &lt;a href="https://lo.ink/" rel="noopener noreferrer"&gt;LO (LiveOnce)&lt;/a&gt;, a social platform combining messaging, calls, communities, entertainment, and digital services.&lt;/p&gt;

&lt;p&gt;We've been developing LO for eight years. During that time, we've redesigned major parts of our architecture, replaced some existing technologies with proprietary solutions, and continued using open-source software wherever it makes sense.&lt;/p&gt;

&lt;p&gt;One of the most significant changes has been the evolution of our real-time communication infrastructure.&lt;/p&gt;

&lt;p&gt;For years, we relied on established technologies, including Centrifugo and, for certain communication-related tasks, mediasoup.&lt;/p&gt;

&lt;p&gt;Eventually, we began transitioning toward our own real-time system and developed ConnectX, our proprietary communication protocol.&lt;/p&gt;

&lt;p&gt;This wasn't a decision driven by a desire to build everything ourselves.&lt;/p&gt;

&lt;p&gt;It came from a more practical question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At what point does adapting your product to an existing technology become more expensive than adapting the technology to your product?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Started with Existing Solutions
&lt;/h2&gt;

&lt;p&gt;When you're building a new product with a small team, your most valuable resources are time and engineering capacity.&lt;/p&gt;

&lt;p&gt;Developing every infrastructure component from scratch is rarely the most efficient way to use either.&lt;/p&gt;

&lt;p&gt;At the beginning of LO, our priority was to build a functioning platform, release features, and validate ideas.&lt;/p&gt;

&lt;p&gt;We didn't need to invent a new database.&lt;/p&gt;

&lt;p&gt;We didn't need to build our own orchestration system.&lt;/p&gt;

&lt;p&gt;And we didn't need to develop every communication component ourselves.&lt;/p&gt;

&lt;p&gt;Existing technologies allowed us to move faster.&lt;/p&gt;

&lt;p&gt;This is one of the greatest advantages of open source.&lt;/p&gt;

&lt;p&gt;Today, a relatively small engineering team can build infrastructure that would have required a much larger organization years ago.&lt;/p&gt;

&lt;p&gt;But there's an important architectural distinction:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choosing an existing technology should accelerate your product's development without permanently determining its future.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Cost of Architectural Workarounds
&lt;/h2&gt;

&lt;p&gt;Most infrastructure technologies are designed to solve problems for a wide range of products.&lt;/p&gt;

&lt;p&gt;That general-purpose approach is exactly what makes them useful.&lt;/p&gt;

&lt;p&gt;However, your product's requirements may eventually become more specific than the assumptions built into the technology.&lt;/p&gt;

&lt;p&gt;Imagine an existing solution satisfies 90% of your requirements.&lt;/p&gt;

&lt;p&gt;The remaining 10% can usually be handled through configuration, additional components, or architectural workarounds.&lt;/p&gt;

&lt;p&gt;At an early stage, this is often the right trade-off.&lt;/p&gt;

&lt;p&gt;But as the product evolves, new requirements appear.&lt;/p&gt;

&lt;p&gt;The workarounds become more complicated.&lt;/p&gt;

&lt;p&gt;Additional layers introduce new dependencies.&lt;/p&gt;

&lt;p&gt;And eventually, your engineering team starts discussing how to implement a feature within the limitations of the existing infrastructure rather than how the feature should work for users.&lt;/p&gt;

&lt;p&gt;That's an important warning sign.&lt;/p&gt;

&lt;p&gt;The real cost of a technology isn't limited to licensing, hosting, or maintenance.&lt;/p&gt;

&lt;p&gt;It also includes the engineering decisions you're forced to make because of its limitations.&lt;/p&gt;

&lt;p&gt;At some point, those limitations can become more expensive than the original technology was intended to save.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Real-Time Communication Became Critical to LO
&lt;/h2&gt;

&lt;p&gt;In LO's early architecture, real-time technologies supported specific communication features.&lt;/p&gt;

&lt;p&gt;As the platform evolved, their role became much more significant.&lt;/p&gt;

&lt;p&gt;Real-time communication now supports multiple parts of the product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Messaging and chats&lt;/li&gt;
&lt;li&gt;Calls&lt;/li&gt;
&lt;li&gt;User presence and status updates&lt;/li&gt;
&lt;li&gt;Application events&lt;/li&gt;
&lt;li&gt;Synchronization across devices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't isolated features anymore.&lt;/p&gt;

&lt;p&gt;They're fundamental components of the overall platform experience.&lt;/p&gt;

&lt;p&gt;This changed how we evaluated our infrastructure.&lt;/p&gt;

&lt;p&gt;We needed greater control over connection establishment, recovery after interruptions, behavior under unstable network conditions, and the future development of the communication layer.&lt;/p&gt;

&lt;p&gt;We could continue adapting our architecture around existing technologies.&lt;/p&gt;

&lt;p&gt;Or we could begin developing a system designed around LO's specific requirements.&lt;/p&gt;

&lt;p&gt;We chose the second approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Moved Beyond Our Previous Stack
&lt;/h2&gt;

&lt;p&gt;For a long time, we used Centrifugo in our real-time infrastructure and mediasoup for certain communication-related tasks.&lt;/p&gt;

&lt;p&gt;Both technologies helped us accelerate development.&lt;/p&gt;

&lt;p&gt;They allowed us to focus on building the product instead of spending years implementing communication infrastructure from scratch.&lt;/p&gt;

&lt;p&gt;I want to emphasize something important here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Replacing a technology doesn't necessarily mean the original choice was wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A solution can be excellent for your product at one stage and become less suitable later.&lt;/p&gt;

&lt;p&gt;The requirements change.&lt;/p&gt;

&lt;p&gt;The architecture evolves.&lt;/p&gt;

&lt;p&gt;And the trade-offs that once made sense may no longer be optimal.&lt;/p&gt;

&lt;p&gt;That's what happened as LO's communication requirements became more complex.&lt;/p&gt;

&lt;p&gt;We began transitioning toward our own real-time infrastructure to gain greater control over a critical part of the platform.&lt;/p&gt;

&lt;p&gt;This wasn't about rejecting open source.&lt;/p&gt;

&lt;p&gt;It was about aligning the infrastructure with the direction of the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  ConnectX: Why We Developed Our Own Protocol
&lt;/h2&gt;

&lt;p&gt;One result of this evolution was &lt;strong&gt;ConnectX&lt;/strong&gt;, LO's proprietary communication protocol.&lt;/p&gt;

&lt;p&gt;Developing a custom protocol can sound excessive, particularly for a platform that hasn't yet reached millions of users.&lt;/p&gt;

&lt;p&gt;But the motivation was practical.&lt;/p&gt;

&lt;p&gt;We wanted greater control over how clients interact with LO's infrastructure.&lt;/p&gt;

&lt;p&gt;That includes connection establishment, connection recovery, handling unstable networks, and the ability to evolve communication behavior as the platform develops.&lt;/p&gt;

&lt;p&gt;In one of our updates, ConnectX optimizations improved connection establishment speed by approximately &lt;strong&gt;20%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This figure refers to a specific optimization we implemented. It shouldn't be interpreted as a universal benchmark against other communication technologies.&lt;/p&gt;

&lt;p&gt;For us, the result demonstrated something important:&lt;/p&gt;

&lt;p&gt;Having control over a critical technology can create measurable improvements in the product.&lt;/p&gt;

&lt;p&gt;Most users will never know what ConnectX is.&lt;/p&gt;

&lt;p&gt;And that's perfectly fine.&lt;/p&gt;

&lt;p&gt;Users don't care which protocol operates behind an application.&lt;/p&gt;

&lt;p&gt;They care whether messaging works, whether calls connect, and whether the app responds quickly.&lt;/p&gt;

&lt;p&gt;Infrastructure should serve those expectations.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Does Building Your Own Technology Make Sense?
&lt;/h2&gt;

&lt;p&gt;Developing proprietary infrastructure creates new responsibilities.&lt;/p&gt;

&lt;p&gt;You become responsible for maintaining the implementation, fixing bugs, testing changes, documenting behavior, and ensuring compatibility as the rest of your system evolves.&lt;/p&gt;

&lt;p&gt;The initial development effort is only part of the cost.&lt;/p&gt;

&lt;p&gt;This is why we don't believe every critical component should automatically be rewritten internally.&lt;/p&gt;

&lt;p&gt;Instead, we evaluate several questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Is the technology limiting product development?
&lt;/h3&gt;

&lt;p&gt;If your team repeatedly has to redesign product features around infrastructure limitations, it may be time to reconsider the technology.&lt;/p&gt;

&lt;p&gt;A few workarounds are normal.&lt;/p&gt;

&lt;p&gt;A growing architecture built primarily around workarounds is a different situation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Would greater control improve the user experience?
&lt;/h3&gt;

&lt;p&gt;Building proprietary technology should create a meaningful advantage.&lt;/p&gt;

&lt;p&gt;That might involve performance, flexibility, reliability, or the ability to support new product requirements.&lt;/p&gt;

&lt;p&gt;For LO, improving control over the communication layer was directly related to the experience we wanted to deliver.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Can the team maintain the technology long-term?
&lt;/h3&gt;

&lt;p&gt;A proprietary system requires ongoing investment.&lt;/p&gt;

&lt;p&gt;It needs maintenance, security updates, testing, documentation, and engineers who understand how it works.&lt;/p&gt;

&lt;p&gt;If your team cannot sustain those responsibilities, building an internal replacement may introduce more risk than it removes.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Can the existing solution be adapted instead?
&lt;/h3&gt;

&lt;p&gt;Sometimes the best approach isn't replacing a technology.&lt;/p&gt;

&lt;p&gt;It may be possible to modify an open-source project, maintain a fork, or extend the existing architecture.&lt;/p&gt;

&lt;p&gt;Building from scratch should be a considered decision, not the default response to every limitation.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Will the architecture remain flexible afterward?
&lt;/h3&gt;

&lt;p&gt;Replacing an external dependency with a proprietary component doesn't automatically make your architecture better.&lt;/p&gt;

&lt;p&gt;A custom system can also become a source of lock-in.&lt;/p&gt;

&lt;p&gt;The goal should be to maintain the ability to evolve the architecture as requirements change.&lt;/p&gt;

&lt;p&gt;These questions aren't a universal formula. They're a way to evaluate whether the benefits of greater control justify the long-term engineering cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Still Use PostgreSQL and Kubernetes
&lt;/h2&gt;

&lt;p&gt;Despite developing ConnectX and moving toward our own real-time infrastructure, we continue using PostgreSQL, Kubernetes, and many other open-source technologies.&lt;/p&gt;

&lt;p&gt;We have no plans to replace them simply to increase the percentage of code written internally.&lt;/p&gt;

&lt;p&gt;A mature database or infrastructure project represents years of engineering work.&lt;/p&gt;

&lt;p&gt;Maintaining an equivalent system requires continuous effort in areas such as security, testing, performance, documentation, and compatibility.&lt;/p&gt;

&lt;p&gt;Open-source communities distribute much of that work across developers and organizations around the world.&lt;/p&gt;

&lt;p&gt;Giving up those advantages without a compelling product reason would be inefficient.&lt;/p&gt;

&lt;p&gt;For us, technological maturity isn't measured by how many proprietary systems we've created.&lt;/p&gt;

&lt;p&gt;It's measured by whether we're making the right architectural decisions for the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source and Vendor Dependency Are Different Problems
&lt;/h2&gt;

&lt;p&gt;There's a fundamental difference between using open-source software and relying entirely on a closed external service.&lt;/p&gt;

&lt;p&gt;With open source, the code is available.&lt;/p&gt;

&lt;p&gt;Depending on the license, you can inspect it, modify it, maintain a particular version, or create your own fork.&lt;/p&gt;

&lt;p&gt;You may also be able to replace the technology with another solution.&lt;/p&gt;

&lt;p&gt;That doesn't mean migration will always be easy.&lt;/p&gt;

&lt;p&gt;Even open-source components can become deeply embedded in an architecture.&lt;/p&gt;

&lt;p&gt;But access to the code provides additional options.&lt;/p&gt;

&lt;p&gt;With a closed third-party service, the situation can be different.&lt;/p&gt;

&lt;p&gt;A provider can change pricing, modify an API, discontinue a feature, or introduce new restrictions.&lt;/p&gt;

&lt;p&gt;If a critical part of your product depends on that provider, its decisions may directly affect your roadmap.&lt;/p&gt;

&lt;p&gt;This is the kind of dependency we try to avoid.&lt;/p&gt;

&lt;p&gt;Our goal isn't independence from code written by others.&lt;/p&gt;

&lt;p&gt;It's independence from decisions made by others that could prevent our product from evolving.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design for the Ability to Replace Technologies
&lt;/h2&gt;

&lt;p&gt;One of the most important lessons from eight years of developing LO is that technologies shouldn't be treated as permanent architectural commitments.&lt;/p&gt;

&lt;p&gt;A solution that works perfectly today may no longer fit your requirements five years from now.&lt;/p&gt;

&lt;p&gt;Your product will change.&lt;/p&gt;

&lt;p&gt;New technologies will appear.&lt;/p&gt;

&lt;p&gt;User expectations will evolve.&lt;/p&gt;

&lt;p&gt;And your architecture needs to be able to evolve as well.&lt;/p&gt;

&lt;p&gt;The mistake isn't choosing a third-party technology.&lt;/p&gt;

&lt;p&gt;The mistake is designing a system in which replacing that technology becomes practically impossible.&lt;/p&gt;

&lt;p&gt;We've changed major architectural decisions several times throughout LO's development.&lt;/p&gt;

&lt;p&gt;Those changes don't mean the previous decisions were failures.&lt;/p&gt;

&lt;p&gt;They helped us build the product at the time.&lt;/p&gt;

&lt;p&gt;But the product evolved, and the architecture needed to evolve with it.&lt;/p&gt;

&lt;p&gt;For us, the ability to replace a component is an important part of long-term technological independence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Invested in Infrastructure Before Reaching Millions of Users
&lt;/h2&gt;

&lt;p&gt;Today, LO has more than 110,000 registered users.&lt;/p&gt;

&lt;p&gt;Compared with the world's largest social platforms, that's still a relatively small audience.&lt;/p&gt;

&lt;p&gt;So why invest so much effort into infrastructure at this stage?&lt;/p&gt;

&lt;p&gt;We could have allocated more resources to marketing and less to technology.&lt;/p&gt;

&lt;p&gt;Perhaps our registered user count would be higher today.&lt;/p&gt;

&lt;p&gt;But we might also have attracted a larger audience to an architecture that would eventually require significant rebuilding.&lt;/p&gt;

&lt;p&gt;For much of LO's eight-year history, we invested primarily in the product and its technological foundation.&lt;/p&gt;

&lt;p&gt;Now the challenge is changing.&lt;/p&gt;

&lt;p&gt;Previously, we needed to demonstrate that we could build and continuously develop a complex platform.&lt;/p&gt;

&lt;p&gt;The next stage is about scaling it.&lt;/p&gt;

&lt;p&gt;Our plans also extend beyond a single application.&lt;/p&gt;

&lt;p&gt;LO already includes messaging, Flows, communities, music, places, and events. We're developing mapping capabilities and planning mini-apps and opportunities for third-party developers.&lt;/p&gt;

&lt;p&gt;When external developers begin building services on top of your infrastructure, that infrastructure becomes part of the product itself.&lt;/p&gt;

&lt;p&gt;At that point, controlling critical technologies becomes even more important.&lt;/p&gt;

&lt;p&gt;This doesn't mean every startup should build its own real-time system before reaching a certain user count.&lt;/p&gt;

&lt;p&gt;For many products, established technologies will remain the better choice for years.&lt;/p&gt;

&lt;p&gt;Our decision was based on LO's particular architecture and long-term direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Principles We Follow Today
&lt;/h2&gt;

&lt;p&gt;After eight years of building LO, our approach can be summarized in three principles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use established open-source technologies when they meet the product's requirements.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's no reason to rebuild something that already works exceptionally well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adapt existing solutions when customization is more efficient than replacement.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A fork, extension, or architectural adjustment may solve the problem without introducing the maintenance burden of a completely new system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build proprietary technology when controlling a critical component creates a meaningful advantage.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where internal development can become a strategic investment rather than unnecessary engineering complexity.&lt;/p&gt;

&lt;p&gt;And above all, keep the architecture flexible enough to reconsider those decisions as the product evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Developing ConnectX taught us that building proprietary infrastructure can make sense when it solves a real product problem.&lt;/p&gt;

&lt;p&gt;Continuing to use PostgreSQL, Kubernetes, and other open-source technologies reminds us that building everything ourselves would be neither practical nor efficient.&lt;/p&gt;

&lt;p&gt;These approaches aren't contradictory.&lt;/p&gt;

&lt;p&gt;They're complementary.&lt;/p&gt;

&lt;p&gt;Open source allows us to benefit from technologies developed by the global engineering community.&lt;/p&gt;

&lt;p&gt;Proprietary systems give us greater control where that control genuinely matters.&lt;/p&gt;

&lt;p&gt;And a flexible architecture allows us to choose between them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technological independence isn't about owning every line of code. It's about maintaining the freedom to decide how your product evolves.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>infrastructure</category>
      <category>startup</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
