<?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: Vincent</title>
    <description>The latest articles on DEV Community by Vincent (@mandarinclips).</description>
    <link>https://dev.to/mandarinclips</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%2F4037181%2F1398a0a9-4430-4970-bf1c-49fd7d937e65.png</url>
      <title>DEV Community: Vincent</title>
      <link>https://dev.to/mandarinclips</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mandarinclips"/>
    <language>en</language>
    <item>
      <title>I Built an Open-Source SEO Indexing Infrastructure with Rust</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Fri, 28 Aug 2026 02:37:38 +0000</pubDate>
      <link>https://dev.to/mandarinclips/i-built-an-open-source-seo-indexing-infrastructure-with-rust-3fld</link>
      <guid>https://dev.to/mandarinclips/i-built-an-open-source-seo-indexing-infrastructure-with-rust-3fld</guid>
      <description>&lt;h2&gt;
  
  
  A website being online does not mean search engines understand it
&lt;/h2&gt;

&lt;p&gt;As developers, we usually think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If my website is deployed and users can access it, the job is done.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But after building content-heavy websites, I realized there is another layer that developers often overlook:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do search engines discover, crawl, and understand my website?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After deployment, many invisible problems can appear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are pages returning the correct HTTP status codes?&lt;/li&gt;
&lt;li&gt;Is the sitemap valid?&lt;/li&gt;
&lt;li&gt;Are URLs structured correctly?&lt;/li&gt;
&lt;li&gt;Are there unexpected 404 pages?&lt;/li&gt;
&lt;li&gt;Are search engines still crawling the website?&lt;/li&gt;
&lt;li&gt;Which URLs are indexed and which are not?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These problems usually do not appear during local development.&lt;/p&gt;

&lt;p&gt;They only appear after your website is live.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem I experienced
&lt;/h2&gt;

&lt;p&gt;While building my own content website, I encountered unexpected indexing issues.&lt;/p&gt;

&lt;p&gt;At first, everything seemed fine.&lt;/p&gt;

&lt;p&gt;The website was running.&lt;br&gt;
The pages were accessible.&lt;br&gt;
The application worked.&lt;/p&gt;

&lt;p&gt;However, search engine crawling behavior changed after some deployment and website structure changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lesson 1: Infrastructure stability affects search engine crawling
&lt;/h2&gt;

&lt;p&gt;The website was initially deployed on Cloudflare Workers.&lt;/p&gt;

&lt;p&gt;Because of runtime limitations, some requests occasionally resulted in 5xx errors.&lt;/p&gt;

&lt;p&gt;For normal users, an occasional failure may only be a small inconvenience.&lt;/p&gt;

&lt;p&gt;But for search engines, repeated failures can affect how they evaluate a website.&lt;/p&gt;

&lt;p&gt;A website that frequently fails to respond correctly is harder for search engines to crawl reliably.&lt;/p&gt;

&lt;p&gt;Eventually, I noticed that search engine crawling activity decreased significantly.&lt;/p&gt;

&lt;p&gt;This made me realize:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Website reliability is not only a user experience problem. It is also a search engine visibility problem.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Lesson 2: URL changes are more dangerous than they look
&lt;/h2&gt;

&lt;p&gt;Later, I changed parts of my URL structure to make it cleaner and more SEO-friendly.&lt;/p&gt;

&lt;p&gt;However, changing URLs is not just a simple string replacement.&lt;/p&gt;

&lt;p&gt;It affects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;redirects&lt;/li&gt;
&lt;li&gt;sitemap generation&lt;/li&gt;
&lt;li&gt;URL discovery&lt;/li&gt;
&lt;li&gt;indexing status&lt;/li&gt;
&lt;li&gt;search engine understanding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without proper monitoring, it is difficult to know whether these changes are helping or hurting.&lt;/p&gt;




&lt;h2&gt;
  
  
  SEO starts before keywords
&lt;/h2&gt;

&lt;p&gt;When people talk about SEO, they often think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keyword research&lt;/li&gt;
&lt;li&gt;ranking optimization&lt;/li&gt;
&lt;li&gt;backlinks&lt;/li&gt;
&lt;li&gt;content strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are important.&lt;/p&gt;

&lt;p&gt;But for developers, there is a more fundamental question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can search engines correctly access and understand my website?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before optimizing keywords, we should make sure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pages are accessible&lt;/li&gt;
&lt;li&gt;URLs can be discovered&lt;/li&gt;
&lt;li&gt;technical SEO issues are detected&lt;/li&gt;
&lt;li&gt;website structure is healthy&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Building IndexFlow
&lt;/h2&gt;

&lt;p&gt;This experience led me to build &lt;strong&gt;IndexFlow-core&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;IndexFlow-core is an open-source search engine indexing infrastructure designed for developers.&lt;/p&gt;

&lt;p&gt;The goal is not to replace SEO professionals.&lt;/p&gt;

&lt;p&gt;Instead, it focuses on the technical foundation between websites and search engines.&lt;/p&gt;

&lt;p&gt;Current focus areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sitemap management&lt;/li&gt;
&lt;li&gt;URL discovery&lt;/li&gt;
&lt;li&gt;SEO quality checks&lt;/li&gt;
&lt;li&gt;Indexing workflow management&lt;/li&gt;
&lt;li&gt;Search engine submission infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/IndexFlowing/IndexFlow-core" rel="noopener noreferrer"&gt;https://github.com/IndexFlowing/IndexFlow-core&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.indexflowing.com" rel="noopener noreferrer"&gt;https://www.indexflowing.com&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Rust?
&lt;/h2&gt;

&lt;p&gt;I wanted IndexFlow to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lightweight&lt;/li&gt;
&lt;li&gt;self-hostable&lt;/li&gt;
&lt;li&gt;reliable&lt;/li&gt;
&lt;li&gt;suitable for long-running services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rust fits this kind of infrastructure project very well.&lt;/p&gt;

&lt;p&gt;During development, I also extracted some reusable components into standalone Rust libraries.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;p&gt;If a component can be useful outside IndexFlow, it should not be locked inside the project.&lt;/p&gt;




&lt;h2&gt;
  
  
  Open-source direction
&lt;/h2&gt;

&lt;p&gt;IndexFlow-core is moving toward an open-source search engine indexing infrastructure.&lt;/p&gt;

&lt;p&gt;The long-term vision is to provide developers with better tools for managing the relationship between their websites and search engines.&lt;/p&gt;

&lt;p&gt;Future improvements include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;better SEO quality gates&lt;/li&gt;
&lt;li&gt;smarter URL scheduling&lt;/li&gt;
&lt;li&gt;multi-site management&lt;/li&gt;
&lt;li&gt;improved indexing monitoring&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;IndexFlow was not created because I wanted to build another SEO tool.&lt;/p&gt;

&lt;p&gt;It started because I encountered a real problem while building websites.&lt;/p&gt;

&lt;p&gt;Deployment issues, URL changes, and indexing problems made me realize:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Search engine visibility also needs infrastructure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is why I started building IndexFlow.&lt;/p&gt;

&lt;p&gt;If you are interested in technical SEO, Rust, or open-source infrastructure, I would love to hear your feedback.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>infrastructure</category>
      <category>opensource</category>
      <category>rust</category>
      <category>seo</category>
    </item>
    <item>
      <title>How I built a high-performance Chinese learning platform with 100k+ TV clips using Rust and Next.js 15</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Mon, 20 Jul 2026 02:44:30 +0000</pubDate>
      <link>https://dev.to/mandarinclips/how-i-built-a-high-performance-chinese-learning-platform-with-100k-tv-clips-using-rust-and-nextjs-2a81</link>
      <guid>https://dev.to/mandarinclips/how-i-built-a-high-performance-chinese-learning-platform-with-100k-tv-clips-using-rust-and-nextjs-2a81</guid>
      <description>&lt;p&gt;Hi dev.to community! 👋&lt;/p&gt;

&lt;p&gt;Today, I’m incredibly excited to share &lt;strong&gt;MandarinClips&lt;/strong&gt;, a side project I’ve been pouring my soul into. It's a high-performance language learning platform that indexes and organizes sentence-sized dialogue segments from authentic Chinese movies and TV series to help language learners transition from sterile textbooks to real-world immersion.&lt;/p&gt;

&lt;p&gt;👉 Check it out here: &lt;a href="https://www.mandarinclips.com" rel="noopener noreferrer"&gt;MandarinClips.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a deep dive into the engineering decisions, performance bottlenecks, and the technical architecture that powers the platform under the hood.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ The High-Level Architecture
&lt;/h2&gt;

&lt;p&gt;I wanted the platform to be blindingly fast, cost-effective, and highly available. Here is the stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js 15 (React 19) + Tailwind CSS + next-intl (for multilingual support).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Rust (Axum framework) + Tokio async runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: PostgreSQL with &lt;code&gt;pg_trgm&lt;/code&gt; (trigram) extension.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage &amp;amp; CDN&lt;/strong&gt;: Backblaze B2 proxied through Cloudflare CDN (S3 API compatible, 0-cost egress).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Backend: Why Rust &amp;amp; Axum?
&lt;/h2&gt;

&lt;p&gt;The backend is responsible for high-frequency search requests, serving sitemaps, and tracking user quota usage. &lt;/p&gt;

&lt;p&gt;Using &lt;strong&gt;Rust&lt;/strong&gt; was a no-brainer for several reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Safety &amp;amp; Zero-Cost Abstractions&lt;/strong&gt;: No garbage collection means zero GC pauses, resulting in extremely predictable latency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Axum &amp;amp; Tokio&lt;/strong&gt;: Axum is a highly ergonomic, thin routing wrapper on top of Tokio. It handles asynchronous tasks with minimal CPU overhead, allowing our single 2-core VPS to handle thousands of concurrent queries without breaking a sweat.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🗄️ Database: Sub-millisecond Fuzzy Search with PG GIN Indexes
&lt;/h2&gt;

&lt;p&gt;With over 100,000 video clips and subtitles indexed, a standard &lt;code&gt;ILIKE '%query%'&lt;/code&gt; search would quickly degrade and result in full table scans, locking up the CPU under high traffic.&lt;/p&gt;

&lt;p&gt;To solve this, we utilized the PostgreSQL &lt;strong&gt;&lt;code&gt;pg_trgm&lt;/code&gt;&lt;/strong&gt; (trigram) extension to build &lt;strong&gt;GIN (Generalized Inverted Index)&lt;/strong&gt; on both Chinese characters and no-tone pinyin strings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;EXTENSION&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;pg_trgm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_clips_text_zh_trgm&lt;/span&gt; 
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;clips&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;GIN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text_zh&lt;/span&gt; &lt;span class="n"&gt;gin_trgm_ops&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_clips_pinyin_search_trgm&lt;/span&gt; 
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;clips&lt;/span&gt; &lt;span class="k"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;GIN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pinyin_search&lt;/span&gt; &lt;span class="n"&gt;gin_trgm_ops&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By querying against these indices, fuzzy matches for queries like "ni hao" or "明天见" take under 1 millisecond locally. We achieve pure O(1) list scans.&lt;br&gt;
🎥 Media Delivery: 0-Cost Egress with Backblaze B2 &amp;amp; Cloudflare&lt;br&gt;
Hosting over 100,000 MP4 video clips can quickly become a bandwidth billing nightmare on standard cloud providers.&lt;br&gt;
We solved this by storing all .mp4 video files and .jpg posters in Backblaze B2, which is part of the Cloudflare Bandwidth Alliance. By proxying the B2 bucket through Cloudflare's global edge network:&lt;br&gt;
All public egress bandwidth is $0.&lt;br&gt;
We configured aggressive Cloudflare Cache Rules (using Cache-Control: public, max-age=86400, s-maxage=604800 headers) so that sitemaps and video assets are served straight from Cloudflare's edge memory, dropping origin VPS bandwidth and IOPS to near-zero.&lt;br&gt;
🌐 Frontend: Next.js 15 &amp;amp; Native 308 Permanent Redirections&lt;br&gt;
For the frontend, we used Next.js 15. One of our recent refactoring milestones was migrating legacy URLs from underscores (_) to SEO-friendly dashes (-).&lt;br&gt;
To preserve SEO link juice, we avoided heavy JS-based Edge middleware and leveraged Next.js's native redirects config in next.config.ts to issue 308 Permanent Redirects at the router level:&lt;br&gt;
// next.config.ts&lt;br&gt;
async redirects() {&lt;br&gt;
  return [&lt;br&gt;
    {&lt;br&gt;
      source: '/sitemap.xml',&lt;br&gt;
      destination: '&lt;a href="https://www.mandarinclips.com/sitemaps/sitemap.xml" rel="noopener noreferrer"&gt;https://www.mandarinclips.com/sitemaps/sitemap.xml&lt;/a&gt;',&lt;br&gt;
      permanent: true,&lt;br&gt;
    }&lt;br&gt;
  ];&lt;br&gt;
}&lt;br&gt;
This is processed natively before any middleware execution, ensuring zero-latency transitions for Googlebot.&lt;br&gt;
🎁 Wrapping Up &amp;amp; Feedback&lt;br&gt;
Building MandarinClips has been an incredible full-stack journey.&lt;br&gt;
I’d love to hear your feedback on the architecture, the Rust Axum setup, or the database indexing! If you're currently learning Chinese (or are just curious about the UI), please check out MandarinClips and let me know your thoughts in the comments below!&lt;br&gt;
Happy hacking! 🚀&lt;/p&gt;

</description>
      <category>rust</category>
      <category>nextjs</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
