Skip to main content

Solo Developer · 2024 - Present

OmniDex

Sub-second search across 1,318 game assets in a native desktop app

<100ms

Search Speed

55+

IPC Commands

1,318+

Assets Indexed

51

Components

Tauri 2.xSvelte 5RustSQLiteTantivy

<100ms

Search Speed

Full-text queries across 1,318+ indexed assets

55+

IPC Commands

Typed Rust handlers bridging frontend to backend

1,318+

Assets Indexed

Production assets from the Hiraeth project

51

Components

Svelte 5 components after the Vue 3 rewrite

The Problem

Hiraeth had grown to 1,318 production assets spread across deeply nested Unreal Engine directories. Textures, meshes, sounds, Blueprints, materials — organized by Unreal conventions that made sense to the engine but not to the people making the game. Finding anything meant navigating folder trees by memory or grep-ing file names and hoping for the best. There was no search. No tags. No way to tell if an asset was actively used in the game or sitting orphaned. Artists would recreate assets that already existed because finding the original took longer than making a new one. The team was losing hours every week to folder archaeology, and the problem got worse with every new asset committed to the project.

  • Manual folder navigation across hundreds of deeply nested Unreal Engine directories
  • No full-text search across asset names, types, tags, or embedded metadata
  • Duplicate assets wasting disk space and causing version confusion across the team
  • No visibility into which assets are actively referenced in-engine versus sitting orphaned

The Architecture

OmniDex is a native desktop app built on Tauri 2.x with a Rust backend handling all indexing, search, and file operations. The frontend started as Vue 3 but was rewritten entirely in Svelte 5 for better reactivity and smaller bundle size. Search is powered by Tantivy, a Rust full-text search engine, with field boosting so asset names rank higher than directory paths. The entire app runs locally with no cloud dependency — game assets never leave the machine, which matters when you are working with unreleased content under NDA.

Tantivy Search Engine

Full-text indexing with field boosting across multiple dimensions. Asset names, types, tags, and paths are indexed separately so searches return the most relevant results first. Name matches are boosted 3x over path matches, so typing a keyword surfaces the asset itself before a folder that contains it. Queries resolve in under 100ms across the full library.

UAsset Binary Parser

Custom Rust parser that reads Unreal Engine's proprietary .uasset binary format to extract embedded thumbnails and metadata. No need to open UE5 just to preview an asset — the parser handles the binary format directly and generates previews for the search results grid.

Rust IPC Layer

55+ Tauri IPC commands bridging the Svelte frontend to the Rust backend. Every database query, file operation, and search request goes through typed Rust handlers. A 16-variant error system ensures every failure mode has a specific, actionable error message rather than a generic crash.

Vue 3 to Svelte 5 Rewrite

The original Vue 3 frontend worked but felt heavy for a desktop app that needs to feel native. Svelte 5 runes gave finer reactivity control with less boilerplate, and the compiled output is smaller. The full rewrite took the component count from ~40 to 51 while reducing overall bundle size and improving perceived responsiveness.

Tantivy Search with Field Boosting

This is the core search function that powers every query in the app. Tantivy indexes each asset across multiple fields, and the query parser boosts name matches over path matches so that the most relevant result appears first. The result is that typing "stone wall" surfaces the texture named "stone_wall_diffuse" before a Blueprint that happens to live in a /stone_wall/ directory. The search is fast enough to run on every keystroke without debouncing.

View Code
Name matches boosted 3x, tag matches 2x. Returns results in under 100ms across 1,318+ assets.
rust
pub fn search_assets(
    index: &Index,
    query_str: &str,
    limit: usize,
) -> Result<Vec<AssetResult>, OmniDexError> {
    let reader = index.reader()?;
    let searcher = reader.searcher();

    let mut query_parser = QueryParser::for_index(
        index,
        vec![field_name, field_type, field_tags, field_path],
    );
    query_parser.set_field_boost(field_name, 3.0);
    query_parser.set_field_boost(field_tags, 2.0);

    let query = query_parser.parse_query(query_str)?;
    let top_docs = searcher.search(&query, &TopDocs::with_limit(limit))?;

    collect_results(&searcher, top_docs)
}

Workflow Transformation

Before OmniDex

Navigate nested folders by memory. Ctrl+F file names in the OS file explorer. Open UE5 just to preview a texture. Duplicate assets go unnoticed until disk space runs low. No one knows which assets are actually used in the game.

After OmniDex

Type a query, get results in under 100ms with thumbnail previews. Filter by asset type, tags, or usage status. See which assets are referenced in the project and which are orphaned. The entire team searches from one app without opening UE5.

Technical Stack

Full Stack Details

Desktop Framework

Tauri 2.xSvelte 5Three-Pane Layout

Backend

RustSQLite/SQLxCompile-Time SQL Verification

Search

TantivyField BoostingFull-Text Indexing

Engineering

55+ IPC Commands16-Variant Error SystemUAsset Binary Parser

Where It Stands

OmniDex is at v2.1.0 and used daily by the entire Hiraeth team. The Svelte 5 rewrite is complete, and the app is stable across Windows and macOS. Search, indexing, and thumbnail extraction all run reliably on the production library. The app handles the full 1,318-asset library without performance issues, and the index rebuilds in seconds when new assets are added to the project.

  • Sub-100ms full-text search with field boosting across the entire Hiraeth production asset library
  • 55+ Tauri IPC commands with compile-time type safety
  • 51 Svelte 5 components and 13 stores after the Vue 3 rewrite
  • Custom UAsset binary parser extracts embedded thumbnails without needing to open UE5
  • Production-ready at v2.1.0 with daily team usage