<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Mikoto]]></title><description><![CDATA[The blog from the world's most overkill messaging application]]></description><link>https://blog.mikoto.io</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Apr 2026 16:11:07 GMT</lastBuildDate><atom:link href="https://blog.mikoto.io/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Building Your Own Cloud for Fun and Profit]]></title><description><![CDATA[The Old Infrastructure
Mikoto is completely bootstrapped, without a monetization strategy so far. This means that every cent counts to maximize our runway. Prior to this migration, we were spending around 48.08 USD per month on a single-node GKE clus...]]></description><link>https://blog.mikoto.io/building-your-own-cloud-for-fun-and-profit</link><guid isPermaLink="true">https://blog.mikoto.io/building-your-own-cloud-for-fun-and-profit</guid><category><![CDATA[Devops]]></category><category><![CDATA[Kubernetes]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[CactusBlue]]></dc:creator><pubDate>Sat, 13 Apr 2024 23:03:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1713048220395/956a2ce2-c571-4cb5-8a68-b3de89e8d5f7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-the-old-infrastructure">The Old Infrastructure</h2>
<p><a target="_blank" href="https://mikoto.io">Mikoto</a> is completely bootstrapped, without a monetization strategy so far. This means that every cent counts to maximize our runway. Prior to this migration, we were spending around 48.08 USD per month on a single-node GKE cluster. While this isn't much for most startups, this is a major cost for a project ran by a fresh graduate with little sources of other income.</p>
<p>Our analysis for the costs:</p>
<ul>
<li><p>Nodes were much more expensive than what you could get from other clouds.</p>
</li>
<li><p>Kubernetes creates Load Balancers per ingress, which eats into a lot of the costs.</p>
</li>
</ul>
<p>Eventually, we've decided the cost was too much, so we'd have to move.</p>
<h2 id="heading-we-have-kubernetes-at-home">We Have Kubernetes at Home</h2>
<p>I've the other Big 3 (AWS, Azure) clouds; while they offered slightly cheaper prices on their cluster. Another option could be to on-prem with our own hardware; this was not feasible due to our geographical location, as well as that we are a fully remote team.</p>
<p>The solution? Run our own Kubernetes cluster. Luckily, <a target="_blank" href="https://k3s.io/">K3s</a> exists, which is a small k8s distribution that can be installed with a single command. We've installed it on a Hetzner VPS.</p>
<h2 id="heading-installing-the-necessary-services">Installing the Necessary Services</h2>
<p>I set up a VPS on Hetzner and set up a k3s node on it. Wasn't particularly difficult.</p>
<p>Even out of the box, k3s comes with Traefik + ServiceLB out of the box. Using a software-based load balancer means that you do not need to pay for fees incurred by additional LoadBalancers (something that most cloud seem to create <em>per</em> Ingress!). Traefik is also a very nice Ingress controller to work with, supporting more feature than the NGINX-based one that comes with many other k8s distros.</p>
<p>One of the first things I set up in any k8s cluster is <a target="_blank" href="https://argo-cd.readthedocs.io/en/stable/">ArgoCD</a>. It handles GitOps - watching a git repository for changes in your Kubernetes manifest, which will be applied to the Kubernetes cluster. We use an app of apps pattern to create an App containing other ArgoCD apps (even ArgoCD itself is managed with it), I was able to quickly replicate the old services from the cluster on Google Cloud into the Hetzner cluster.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1713048284611/015258a7-0997-49e7-9b11-01b8821143a8.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Some of the services that power Mikoto now</p>
</blockquote>
<p>After that, I've installed Cert-Manager, so that every service in the cluster can get HTTPS with minimal work on the container-level. Previously, we used HTTP01 challenge (which was less effort to set up), but we moved to DNS01 challenge, so that one Let's Encrypt Certificate could be shared for the entire infrastructure, and that we didn't need to wait for the certificate issuance every time we add a new service.</p>
<pre><code class="lang-yaml"><span class="hljs-attr">apiVersion:</span> <span class="hljs-string">cert-manager.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Issuer</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">letsencrypt-dns</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">acme:</span>
    <span class="hljs-attr">server:</span> <span class="hljs-string">https://acme-v02.api.letsencrypt.org/directory</span>
    <span class="hljs-attr">privateKeySecretRef:</span>
      <span class="hljs-comment"># Secret resource that will be used to store the account's private key.</span>
      <span class="hljs-attr">name:</span> <span class="hljs-string">letsencrypt-dns-private-key</span>
    <span class="hljs-attr">solvers:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">selector:</span>
          <span class="hljs-attr">dnsZones:</span>
            <span class="hljs-bullet">-</span> <span class="hljs-string">"mikoto.io"</span>
        <span class="hljs-attr">dns01:</span>
          <span class="hljs-attr">cloudflare:</span>
            <span class="hljs-attr">apiTokenSecretRef:</span>
              <span class="hljs-attr">name:</span> <span class="hljs-string">cloudflare-api-token</span>
              <span class="hljs-attr">key:</span> <span class="hljs-string">API_TOKEN</span>
<span class="hljs-meta">---</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">cert-manager.io/v1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">Certificate</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">mikoto-wildcard</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">secretName:</span> <span class="hljs-string">mikoto-certificate</span>
  <span class="hljs-attr">issuerRef:</span>
    <span class="hljs-attr">name:</span> <span class="hljs-string">letsencrypt-dns</span>
    <span class="hljs-attr">kind:</span> <span class="hljs-string">Issuer</span>
  <span class="hljs-attr">commonName:</span> <span class="hljs-string">"*.mikoto.io"</span>
  <span class="hljs-attr">dnsNames:</span>
    <span class="hljs-comment"># ... the domains go here</span>
<span class="hljs-meta">---</span>
<span class="hljs-attr">apiVersion:</span> <span class="hljs-string">traefik.containo.us/v1alpha1</span>
<span class="hljs-attr">kind:</span> <span class="hljs-string">TLSStore</span>
<span class="hljs-attr">metadata:</span>
  <span class="hljs-attr">name:</span> <span class="hljs-string">default</span>
<span class="hljs-attr">spec:</span>
  <span class="hljs-attr">defaultCertificate:</span>
    <span class="hljs-attr">secretName:</span> <span class="hljs-string">mikoto-certificate</span>
</code></pre>
<p>Just adding this manifest will automatically make every Ingress in your K8s project use HTTPS!</p>
<h2 id="heading-getting-rid-of-cockroachdb">Getting Rid of CockroachDB</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1713047027942/dc5984ff-2e44-45d6-94ba-b05025dec639.png" alt class="image--center mx-auto" /></p>
<p>Now, one of the things that we had problems with was moving out of CockroachDB Serverless. Mikoto keeps the DB close to the server for performance, but they did not offer CockroachDB serverless on Hetzner.</p>
<p>We previously used CockroachDB because it was free and it advertised itself as PostgreSQL-compatible. However, this is misleading, as the compatibility was surface level deep. Sure, the wire protocol is the same, and much of the syntax will work on both databases as well. However, no extension will work on CockroachDB, like PGVector, which blocked us from releasing our AI-powered search features.</p>
<p>Even more, CockroachDB cannot take advantages of the wide range of tools built for PostgreSQL (ORMs, Migration tools, Database Viewers), because the metadata-related queries for retrieving table information work in different ways.</p>
<p>Another main issue was the licensing: CockroachDB is licensed under BSL, a source-available license. This is problematic for us, in that Mikoto is open-source and running Mikoto would require using non-OSS software. While I have nothing against the CockroachDB team, but it was increasingly clear that their product direction did not fit my needs.</p>
<h3 id="heading-postgresql-on-kubernetes">PostgreSQL on Kubernetes</h3>
<p>Because of this, we've decided to bite the bullet and migrate out of CockroachDB and back into PostgreSQL. But even that was difficult; again, CockroachDB is only compatible with PostgreSQL on surface level. CockroachDB handles backups by its <code>BACKUP</code> statements.</p>
<p>The solution we settled on was to use <code>cockroach dump</code> from an old version of CockroachDB (the newer versions had deprecated the command), to dump just the table data, then use a few scripts to patch up the data to be imported into the PostgreSQL server running on my Kubernetes cluster.</p>
<p>We've used <a target="_blank" href="https://github.com/cloudnative-pg/cloudnative-pg">CloudNative-PG</a> operator for PostgreSQL, which manages the installation of the software. We have it configured to continuously archive the cluster using Barman into a S3-compatible storage.</p>
<h2 id="heading-the-future">The Future</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Infrastructure</td><td>GCP (Old)</td><td>Hetzner (New)</td></tr>
</thead>
<tbody>
<tr>
<td>Stack</td><td>GKE + CockroachDB</td><td>k3s + PostgreSQL</td></tr>
<tr>
<td>Specs</td><td>2 Cores / 4GB RAM</td><td>4 Cores / 8GB RAM</td></tr>
<tr>
<td>Cost (USD)</td><td>$48.08</td><td>$15.34</td></tr>
</tbody>
</table>
</div><p>Our move brought our costs to 15.34 USD per month (nearly 70% in savings), even when using a node that was almost twice as powerful!</p>
<p>From our move from GCP to Hetzner, we've saved cut our costs by over 2/3 and doubled our capacity, while keeping all the benefits of running your services on a cloud. Of course, the big clouds have a reason to be more expensive, and while I haven't had to deal with them, I assume they have more support regarding scaling up and support. However, modern computers are stupidly powerful, and you can get decently far with just optimizing your code - our current infrastructure is expected to support at least a few hundred thousand concurrent users!</p>
<p>This blog post was written somewhat hastily and might contain many mistakes - please let me know if you're interested in some parts, or if you want me to expand on the parts I haven't covered, and I will update this post. Sorry for not keeping up with my own blogging schedules. Expect a lot more blog posts from me now!</p>
]]></content:encoded></item><item><title><![CDATA[Our Super-Secret Plan to Bring the Internet Back (Part 1)]]></title><description><![CDATA[Currently, not many people know of Mikoto other than as "An open-source alternative to Discord", even though we've had many big features that differentiates us. I think much of that was my fault, because despite it being open source, I didn't talk mu...]]></description><link>https://blog.mikoto.io/secretplan1</link><guid isPermaLink="true">https://blog.mikoto.io/secretplan1</guid><category><![CDATA[Programming Blogs]]></category><category><![CDATA[Startups]]></category><category><![CDATA[social media]]></category><dc:creator><![CDATA[CactusBlue]]></dc:creator><pubDate>Wed, 13 Mar 2024 00:47:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1710290682315/ec6a41ef-719b-4620-9044-ad4c6757863d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Currently, not many people know of Mikoto other than as "An open-source alternative to Discord", even though we've had many big features that differentiates us. I think much of that was my fault, because despite it being open source, I didn't talk much in public about the new features that I've released, or what I'm working towards.</p>
<p>This tweet inspired me to write this blog post:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710287929542/9d50ad24-16fd-497d-97d8-5731d657a3f0.png" alt="What if we gave everyone their own internet?" class="image--center mx-auto" /></p>
<blockquote>
<p>What if we gave everyone their own internet?</p>
</blockquote>
<p>We can easily tell that the internet (at least the social web) is broken. It's difficult to find any good content, 99% of the things you see are spam (to the point where people think "<a target="_blank" href="https://en.wikipedia.org/wiki/Dead_Internet_theory">Dead Internet Theory</a>" is real!), and everything is focused around quick dunks over productive discussions.</p>
<p>Still, I'm not a doomer. I think I have a good enough plan to fix at least some of the problems with it.</p>
<h2 id="heading-we-need-mixed-use-skyscrapers-not-public-squares">We need mixed-use skyscrapers, not public squares</h2>
<p>Elon Musk has described that he is planning on making X (formerly known as Twitter) into a public square of the internet.</p>
<p>The thing is, no one wants to live in a public square: Imagine if you were living in a public square. It's way too noisy. There's some guy on the end of the street yelling about conspiracy theories. There are two drunk guys fighting it out under one of the trees. No one wants to be homeless. Maybe the public square isn't right for you. What you need isn't a public square, but a home.</p>
<p>No one wants an internet where they see every political discourse, nor every low-effort meme repost, or every "NUDES IN MY BIO". We think we do, but not because we want to: because that's what we're addicted to. That's what all the websites today do. This is inevitable, because they're all paid by how long they can keep the users on the app, not by how much value they're providing to the user. <strong>THEY DON'T WANT TO PROVIDE VALUE. THEY WANT TO EXTRACT YOURS.</strong> The incentives are misaligned from the start.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710288274997/5b0ce78c-3cf1-4379-bc6e-3df98df030d3.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p><em>Some of the cracked people in a twitter DM that I'm it</em></p>
</blockquote>
<p>In my personal experience over 10 or so years on the internet, the best experiences on any website, whether that be Skype, Reddit, Twitter, Discord, or various forums, wasn't interacting with the majority of the users. The best parts happened when some level of credibility was built, and you started getting invited into private groups, usually filled with anime pfp anons. It's arguably one of the parts with the highest alpha on the internet, yet there are almost no startups catering to this.</p>
<p>If other websites are all focused on the gold rush of building the "public square", Mikoto is skyscrapers full of residential and commercial units, to borrow their analogy. We want to build mostly-private part of the internet that you can call to be your home, while still maintaining the capability to cross-reference parts of the internet and only publish the parts that are actually valuable.</p>
<h2 id="heading-our-not-so-secret-plan">Our (not-so) secret plan</h2>
<h3 id="heading-step-1-build-a-community-app-thats-really-fucking-good">Step 1: Build a community app that's really fucking good</h3>
<p>Mikoto achieves this by ruthlessly optimizing for signal-to-noise ratio. Every UI component means something; There are remappable hotkeys for every action; the layout is highly malleable. Many people have made comparisons of Mikoto with text editors/IDEs in terms of UI: This was exactly what I was going for - instead of optimizing for the lowest common denominator, we optimize for the superuser.</p>
<p>To do this: I've taken inspirations from text editors/IDEs like VS Code and JetBrains software, Which were always designed with superusers in mind first.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710288506890/f4cfa2ed-f61b-44be-aad5-30493433f208.png" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1710288488050/47770e8b-b6d1-448a-8b19-b965e95b0e98.png" alt class="image--center mx-auto" /></p>
<blockquote>
<p>Top: VS Code, with the Mikoto codebase</p>
<p>Bottom: the main Mikoto space</p>
</blockquote>
<p>See the similar UI idioms, but translated to a communication software from a developer software? The idioms of tabs, a tree-view of subjects, and split-screen window managements are all there. and it's immediately intuitive.</p>
<h2 id="heading-end-of-the-blog-for-now">End of the blog (for now)</h2>
<p>That was shorter than I expected, and I will have more parts to this blog coming out soon. Mikoto builds for the internet of the future; we're not here to restore it to its original form, or preserve the current flawed models of today.</p>
<p>Mikoto solves a very narrow section of the problem, and it's not enough to save all of the internet. We might even discover new problem as it grows. We might even be completely wrong regarding this hypothesis. I refer to building a social platform as "One of the hardest problems in the world" - because it is.</p>
<p>Still, I'm giving myself a pat in the back because this is a problem that even Elon Musk failed to solve, but I've managed to make some dent in the problem, and I'm proud of me and my community for getting at least that far.</p>
<p>Mikoto is already available as public alpha at <a target="_blank" href="https://alpha.mikoto.io">https://alpha.mikoto.io</a>: we will be entering public beta soon.</p>
]]></content:encoded></item><item><title><![CDATA[AI-native collaboration means desegregating AIs and humans]]></title><description><![CDATA[On many platforms, humans and AIs are separate types of entities with separate capabilities. Discord only allows humans to create group chats. Poe only allows humans to initiate interactions. Likewise, some features are only accessible to AIs: Only A...]]></description><link>https://blog.mikoto.io/ai-native-collaboration-means-desegregating-ais-and-humans</link><guid isPermaLink="true">https://blog.mikoto.io/ai-native-collaboration-means-desegregating-ais-and-humans</guid><category><![CDATA[Collaboration]]></category><category><![CDATA[discord]]></category><category><![CDATA[AI]]></category><category><![CDATA[large language models]]></category><category><![CDATA[Open Source]]></category><dc:creator><![CDATA[ampdot]]></dc:creator><pubDate>Thu, 04 Jan 2024 04:15:56 GMT</pubDate><content:encoded><![CDATA[<p>On many platforms, humans and AIs are separate types of entities with separate capabilities. Discord only allows humans to create group chats. Poe only allows humans to initiate interactions. Likewise, some features are only accessible to AIs: Only AIs can branch a conversation into multiple forks in ChatGPT. But imagine if everyone had everyone else's capabilities. Discord bots could make group chats, Poe bots could proactively and asynchronously find information, and humans could branch conversations into multiple subthreads.</p>
<p>We need to desegregate AIs and humans. Humans should be able to query AIs, AIs should be able to query humans, and AI should be able to query other AIs.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td></td><td>...humans</td><td>...AI</td></tr>
</thead>
<tbody>
<tr>
<td>Humans querying...</td><td>Slack</td><td>ChatGPT+, Poe</td></tr>
<tr>
<td>AI querying...</td><td>N/A</td><td>N/A</td></tr>
</tbody>
</table>
</div><p>Mikoto will unify all these queries with one protocol, that uses structured data when possible with fallback to natural language.</p>
<p>Mikoto is a platform for a global mesh network of humans and AIs cooperating as equals.</p>
<p>Mikoto is open-source Discord for everyone, whether you're carbon or silicon based.</p>
]]></content:encoded></item></channel></rss>