<?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: SeaCloud Labs</title>
    <description>The latest articles on DEV Community by SeaCloud Labs (seacloud-labs).</description>
    <link>https://dev.to/seacloud-labs</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%2Forganization%2Fprofile_image%2F14504%2F9bf59a0a-949b-4d60-9f0a-b21c4e3517f5.png</url>
      <title>DEV Community: SeaCloud Labs</title>
      <link>https://dev.to/seacloud-labs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/seacloud-labs"/>
    <language>en</language>
    <item>
      <title>SeaTicket: An Open-Source Support Center for Your Community</title>
      <dc:creator>SeaTicket</dc:creator>
      <pubDate>Wed, 04 Nov 2026 09:47:43 +0000</pubDate>
      <link>https://dev.to/seacloud-labs/seaticket-an-open-source-support-center-for-your-community-3b4k</link>
      <guid>https://dev.to/seacloud-labs/seaticket-an-open-source-support-center-for-your-community-3b4k</guid>
      <description>&lt;p&gt;Support requests come in through GitHub, Discord, forums, and email. Bug reports, user questions, and discussions happen across all these channels, making it difficult for maintainers to keep track of requests, find existing answers, and provide consistent support.&lt;br&gt;&lt;br&gt;
AI assistants like ChatGPT, Claude, Gemini can help answer questions, but maintainers still have to gather documentation, issues, and discussions from different platforms and provide that context manually. This adds work, and even with the right information, AI can overlook details, misinterpret documentation, or make assumptions that lead to incorrect answers. These mistakes can mislead users, create more work for maintainers, and ultimately undermine the community's trust in the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  One support center for all your channels
&lt;/h2&gt;

&lt;p&gt;SeaTicket brings issues and questions from GitHub, Discord, forums and email into one workspace, with connections to tools such as Jira, Linear and Confluence. Maintainers can see what the community is reporting across channels and notice when separate conversations describe the same problem.&lt;br&gt;
The channels themselves stay where they are. SeaTicket syncs with each one, and approved replies are posted back to the original thread, so users get their answer where they asked while the team tracks the work in a single place.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl00thpji1tj415icvn3u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl00thpji1tj415icvn3u.png" alt="Connect with your community by connecting where your issues come from to your documents and tasks" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A more reliable way to handle support with AI
&lt;/h2&gt;

&lt;p&gt;SeaTicket's AI agent uses your project's documentation, issues, and past discussions to investigate support requests. It finds relevant information, identifies related issues, and drafts answers with references to the original sources, allowing maintainers to verify the information before responding.&lt;br&gt;
When a report needs engineering work, the agent suggests creating a ticket for the team to assign and track through resolution. Nothing is sent, posted, or closed automatically. Maintainers review each recommendation and can approve, edit, or discard it before taking action.&lt;br&gt;
Once an issue is resolved, its answer can be saved as searchable knowledge. This helps users find existing solutions and reduces repetitive questions. By grounding answers in project information and keeping maintainers in control, SeaTicket helps teams provide more reliable, consistent support as their community grows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj79bdx1nr3cc0gfhyfwm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj79bdx1nr3cc0gfhyfwm.png" alt="AI Agent working on background continuously drafting answers for you to approve" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A front door for your community
&lt;/h2&gt;

&lt;p&gt;For open-source maintainers, a dedicated support portal shows that their community matters. It gives users an official place to find answers, ask questions, report issues, and track their requests, building trust and making support feel like a core part of the project.&lt;br&gt;
SeaTicket's portal brings AI chat powered by the project's knowledge base, browsable documentation, and ticket submission and tracking into one place. Users can help themselves first, finding answers and resolving common questions without waiting for a maintainer. This self-service approach reduces repetitive requests and gives the team more time to focus on building and improving the project.&lt;br&gt;
Instead of questions scattered across different channels, users get a clear path to give feedback, and maintainers get one place to manage requests. The portal connects directly to your workspace, keeping the process streamlined from the first question to resolution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fofk86r0xjig2njv5vt20.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fofk86r0xjig2njv5vt20.png" alt="Self Service Support Portal for your community" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  An open-source alternative to Zendesk
&lt;/h2&gt;

&lt;p&gt;Zendesk is a capable support platform, but its closed-source model and per-agent pricing can push costs up as a team grows. Each added maintainer means another seat, and AI usage can bring further charges.&lt;br&gt;
SeaTicket takes a different approach. It is open source under the Apache 2.0 license and includes unlimited team members. Cloud pricing is based on issue volume and AI credits rather than seats, so a growing team does not mean buying more seats. SeaTicket can also be self-hosted, which Zendesk does not offer, and its code can be inspected and modified for more control over the software and how it is used.&lt;br&gt;
The support portal is another point of difference. SeaTicket's external portal, where a community can chat with AI, browse the docs and submit and track its own issues, is included on every Cloud plan, Free included. On Zendesk's plan comparison, the customer portal, where customers manage their own requests, comes at an added cost and is not included on every plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the data goes
&lt;/h2&gt;

&lt;p&gt;Support conversations can contain sensitive information, so data privacy matters.&lt;br&gt;
Self-hosted deployments keep data on servers the team controls, in its own database and file storage, and the team decides who has access. SeaTicket Cloud stores data in the service SeaTicket runs, and it can be exported at any time.&lt;br&gt;
When AI is used, SeaTicket sends the relevant text to an AI model. Teams that self-host choose that model: a hosted one from a provider such as OpenAI or Google, or a model they run themselves so the text never leaves their own servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built from the work of supporting Seafile
&lt;/h2&gt;

&lt;p&gt;SeaTicket comes from the team behind Seafile, an open-source platform developed since 2012. Supporting Seafile's community across GitHub, forums and email meant answering the same questions repeatedly, searching for past fixes, and trying not to lose important feedback among routine requests. SeaTicket grew out of that experience, built to organize the work and to help other maintainers facing the same challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  A path to an answer for every issue
&lt;/h2&gt;

&lt;p&gt;Open-source communities do best when people can get help, report problems and see that someone is listening. SeaTicket gives maintainers one place to gather the conversation, investigate with AI, route unresolved issues to engineers, and reply with sources you can verify. The aim is straightforward: support issues resolved sooner, and a more consistent experience for the people asking.&lt;/p&gt;

&lt;p&gt;SeaTicket Cloud is &amp;nbsp;&lt;a href="https://seaticket.ai/" rel="noopener noreferrer"&gt;free to try&lt;/a&gt;&amp;nbsp;, and the open-source code is available on &amp;nbsp;&lt;a href="https://github.com/seacloud-lab/seaticket" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&amp;nbsp;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why we stopped using one Elasticsearch index per tenant and built our own</title>
      <dc:creator> SeaCloud Labs</dc:creator>
      <pubDate>Thu, 17 Sep 2026 08:13:38 +0000</pubDate>
      <link>https://dev.to/seacloud-labs/why-we-stopped-using-one-elasticsearch-index-per-tenant-and-built-our-own-1a7c</link>
      <guid>https://dev.to/seacloud-labs/why-we-stopped-using-one-elasticsearch-index-per-tenant-and-built-our-own-1a7c</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; We open-sourced &amp;nbsp;&lt;a href="https://github.com/seacloud-lab/seasearch" rel="noopener noreferrer"&gt;SeaSearch&amp;nbsp;&lt;/a&gt;, an Elasticsearch-compatible search engine that keeps index data in S3 and routes ownership instead of replicating data, so tenant count isn't capped by cluster state.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tax on one index per tenant
&lt;/h2&gt;

&lt;p&gt;If you've built multi-tenant search on Elasticsearch, you've had this argument with yourself.&lt;br&gt;
The clean approach to multi-tenant search is one Elasticsearch index per tenant. Data stays physically separate, queries only hit the relevant tenant's data, and a traffic spike from one customer does not slow down anyone else's.&lt;br&gt;
But every index costs at least one shard, and each shard is basically its own mini Lucene database, with its own files, its own background maintenance work, its own chunk of memory. &lt;br&gt;
Separately, every index's mappings and routing information live in cluster state, which the master maintains and replicates to every node. A few thousand indexes and mapping updates get sluggish. Tens of thousands and the master node becomes the thing you page about at 3am.&lt;/p&gt;
&lt;h2&gt;
  
  
  We didn't want to write a search engine
&lt;/h2&gt;

&lt;p&gt;Two years ago we started looking for a way out. The first decision was to not build a search engine from scratch. Analyzers, scoring, segment merging, query planning. That's decades of accumulated work and we had no interest in relearning it badly.&lt;br&gt;
&lt;a href="https://github.com/zincsearch/zincsearch" rel="noopener noreferrer"&gt;ZincSearch&amp;nbsp; &amp;nbsp;&lt;/a&gt;got us most of the way. Written in Go instead of the JVM, where Bluge is doing the indexing underneath, and an Elasticsearch-compatible API surface. That handled the runtime footprint and the migration story in one move.&lt;br&gt;
What it didn't solve: running an unbounded number of indexes across a cluster without paying for that isolation in replicated storage and operational complexity. That's the part we built, and it's most of what SeaSearch is.&lt;/p&gt;
&lt;h2&gt;
  
  
  Put the indexes in S3 and route ownership instead of data
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Compute nodes hold no authoritative data, so failover is a map update rather than a data migration.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhsumna2pdvozcrmvrtmf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhsumna2pdvozcrmvrtmf.png" alt="SeaSearch Architechure" width="800" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Four moving pieces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compute nodes serve reads and writes. They all talk to the same S3-compatible bucket, where index data is stored.&lt;/li&gt;
&lt;li&gt;etcd holds cluster metadata: index metadata and the partition ownership map.&lt;/li&gt;
&lt;li&gt;The cluster manager watches node health and decides who owns what.&lt;/li&gt;
&lt;li&gt;The proxy (gateway) takes a client request, looks up which node owns that index, and forwards it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Indexes are hashed into a fixed number of partitions. The cluster manager keeps a partition-to-node map in etcd. The proxy reads that map to route. When a node dies or a new one joins, the manager recomputes the map and hands ownership over.&lt;br&gt;
Nothing moves. The new owner pulls what it needs from S3 on demand.&lt;br&gt;
Compare that to a replica-based cluster, where high availability means a second physical copy of your data on another node, and rebalancing means shipping gigabytes across the network while your cluster is already unhappy. With shared storage, adding read capacity is: start a node, update the map. Losing a node is: update the map.&lt;br&gt;
This is why the index count stops being scary. Creating an index adds an entry to etcd, not a shard to a cluster state document that every node has to agree on.&lt;/p&gt;
&lt;h2&gt;
  
  
  The obvious objection: S3 is slow
&lt;/h2&gt;

&lt;p&gt;It is. A round trip to object storage is roughly an order of magnitude worse than local NVMe, and search is a latency-sensitive workload. Caching here is mandatory.&lt;br&gt;
The thing that makes the cache easy is that index data is organized into &lt;strong&gt;immutable segments&lt;/strong&gt;. Once a segment is written it can be read or deleted, never modified.&lt;br&gt;
Cache invalidation is the hard part of caching. Immutability deletes the question entirely. If you have the segment locally, your copy is correct.&lt;br&gt;
Compute nodes keep a rotating local disk cache. When it fills, old segments get evicted to make room. That's what lets a node serve an index larger than its own disk: it just churns through segments.&lt;/p&gt;

&lt;p&gt;Two things make the cold path tolerable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Parallel warm-up.&lt;/strong&gt; Modern datacenter bandwidth is enormous and a single-threaded fetch wastes it. During warm-up we pull many segments from S3 concurrently, which turns a serial latency problem into a bandwidth problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Distributed query execution.&lt;/strong&gt; For very large indexes, SeaSearch can split a single query across multiple compute nodes. Each loads and searches a slice in parallel, and results get aggregated. This does two useful things at once: queries go faster, and cache pressure gets spread out instead of crushing one node.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Latency in practice:&lt;/strong&gt; the first query after a node starts, or after a segment gets evicted, is slow. Every query after that runs at roughly local-disk speed. For file metadata search, where the active working set is a small fraction of total data, that's been a good trade for two years. If your workload touches all of your data uniformly and constantly, it would be a worse one.&lt;/p&gt;
&lt;h2&gt;
  
  
  The ranking problem with multiple indexes
&lt;/h2&gt;

&lt;p&gt;Searching across many independent indexes introduces another problem: the relevance scores from those indexes aren't directly comparable.&lt;br&gt;
BM25 scores are computed from index-local statistics: term frequency, document count, average field length. A match for &amp;nbsp;invoice&amp;nbsp; in a twelve-document library gets a score computed against completely different statistics than the same match in a 400,000-document library. Both &amp;nbsp;&lt;code&gt;_search&amp;nbsp;&lt;/code&gt; across multiple indexes and &amp;nbsp;&lt;code&gt;_msearch&lt;/code&gt;&amp;nbsp; score each index independently.&lt;br&gt;
Merge those results, sort by score, and your top hit mostly reflects which library the file happens to live in. Users don't file that as "inconsistent scoring across index statistics." They file it as "why is this random file at the top."&lt;br&gt;
So we added a unified search endpoint that computes comparable scores across the whole set of indexes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/api/unified_search&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"index_queries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"library-a1b2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"index"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"library-c3d4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The constraint is that the query has to be the same for each index, aside from filters. That's fine for the "search everything I can see" case, which is the case that needed it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it doesn't do
&lt;/h2&gt;

&lt;p&gt;Compatibility claims are worth less than a list of what's missing, so here's ours.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No shards or replicas settings.&lt;/strong&gt; &amp;nbsp;&lt;code&gt;number_of_shards&lt;/code&gt;&amp;nbsp; and &lt;code&gt;&amp;nbsp;number_of_replicas&lt;/code&gt;&amp;nbsp; are meaningless under shared storage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Field types are limited&lt;/strong&gt; to text, keyword, numeric, bool, date, and vector. No &amp;nbsp;&lt;code&gt;nested&amp;nbsp;&lt;/code&gt;, &amp;nbsp;&lt;code&gt;object&amp;nbsp;&lt;/code&gt;, or &amp;nbsp;&lt;code&gt;flattened&amp;nbsp;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mappings are additive.&lt;/strong&gt; You can add fields. You can't change existing ones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unsupported search parameters:&lt;/strong&gt; &amp;nbsp;&lt;code&gt;indices_boost&amp;nbsp;&lt;/code&gt;, &amp;nbsp;&lt;code&gt;knn&amp;nbsp;&lt;/code&gt;, &amp;nbsp;&lt;code&gt;min_score&amp;nbsp;&lt;/code&gt;, &amp;nbsp;&lt;code&gt;retriever&amp;nbsp;&lt;/code&gt;, &amp;nbsp;&lt;code&gt;pit&amp;nbsp;&lt;/code&gt;, &amp;nbsp;&lt;code&gt;runtime_mappings&amp;nbsp;&lt;/code&gt;, &amp;nbsp;&lt;code&gt;seq_no_primary_term&amp;nbsp;&lt;/code&gt;, &amp;nbsp;&lt;code&gt;stats&amp;nbsp;&lt;/code&gt;, &amp;nbsp;&lt;code&gt;terminate_after&amp;nbsp;&lt;/code&gt;, &amp;nbsp;&lt;code&gt;version&amp;nbsp;&lt;/code&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your durability is your object store's durability.&lt;/strong&gt; That's a feature if you're on S3 or a well-run MinIO cluster. It's a problem if you were planning to point it at a single disk and call it a day.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're running Elasticsearch for observability with deep aggregation pipelines and ILM policies, SeaSearch is not your replacement and we won't pretend otherwise. If you're running app search for a multi-tenant product, it probably is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we're open-sourcing this
&lt;/h2&gt;

&lt;p&gt;We built SeaSearch because Seafile needed it and we think the architecture solves a problem that other multi-tenant applications may also run into. There's no paid tier and no feature set held behind a commercial license.&lt;br&gt;
We'd rather have people use it, test it, and tell us where it breaks than keep it sitting inside one company's infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tell us how yours breaks
&lt;/h2&gt;

&lt;p&gt;Curious what other people landed on, because every option has failures and nobody writes about theirs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Where did it start hurting, and at what document count?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How many indexes before cluster state became the bottleneck?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How do you handle promotion?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What does that cost you in operations?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code and issues: &amp;nbsp;&lt;a href="https://github.com/seacloud-lab/seasearch" rel="noopener noreferrer"&gt;https://github.com/seacloud-lab/seasearch&lt;/a&gt;&lt;br&gt;
Docs: &amp;nbsp;&lt;a href="https://seasearch-manual.seacloud-labs.ai/latest/%C2%A0" rel="noopener noreferrer"&gt;https://seasearch-manual.seacloud-labs.ai/latest/&amp;nbsp;&lt;/a&gt;&lt;br&gt;
Happy to answer architecture questions in the comments.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>go</category>
      <category>elasticsearch</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
