Skip to content

Commit b09cde5

Browse files
committed
blog: finalized Searchcraft use-case blog post.
1 parent a0f4be5 commit b09cde5

3 files changed

Lines changed: 49 additions & 36 deletions

File tree

web/blog/2026-07-20-made-with-wasp-searchcraft.mdx

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
11
---
2-
title: "Made with Wasp: how Searchcraft built a full-stack SaaS for their Rust search engine"
2+
title: "Made with Wasp: how Searchcraft built a full-stack SaaS around their Rust search engine"
33
authors: [matijasos]
44
image: /img/searchcraft-vektron/searchcraft-hero.webp
55
tags: [showcase, wasp, saas, rust, web dev]
66
keywords: ["rust search engine", "algolia alternative", "elasticsearch alternative", "self-hosted search engine", "open source search engine alternative", "wasp framework production app", "full-stack react node prisma app", "saas dashboard framework", "open saas template", "search engine on raspberry pi", "build saas dashboard fast", "rust and react architecture", "multi-tenant saas example", "wasp use case"]
7-
description: "How Searchcraft, a Rust-based Algolia alternative, built Vektron - their full-stack user dashboard - with Wasp and the Open SaaS template."
8-
unlisted: true
7+
description: "How Searchcraft, a Rust-based Algolia alternative, built their full-stack customer dashboard with Wasp and the Open SaaS template."
98
---
109

1110
import { ImgWithCaption } from './components/ImgWithCaption';
1211
import { VideoWithCaption } from './components/VideoWithCaption';
1312

1413
<ImgWithCaption
1514
source="img/searchcraft-vektron/searchcraft-hero.webp"
16-
alt="Searchcraft - a Rust-based search engine, with Vektron, its Wasp-powered user dashboard"
15+
alt="Searchcraft - a Rust-based search engine, with its Wasp-powered customer dashboard"
1716
/>
1817

1918

2019
## TL;DR
2120

2221
- **[Searchcraft](https://searchcraft.io)** is a search engine written in Rust: an Algolia / Elasticsearch alternative that's light enough to run full-text search over all of English Wikipedia [on a single Raspberry Pi](https://www.youtube.com/watch?v=SjuPn6_yl2s).
23-
- **Vektron**, their full-stack user dashboard (auth, billing, analytics, index management), is built with **Wasp** and the [Open SaaS](https://opensaas.sh) template.
22+
- Their full-stack customer dashboard (auth, billing, analytics, index management) is built with **Wasp** and the [Open SaaS](https://opensaas.sh) template.
2423
- They could have built the SaaS layer themselves, but chose not to, so their engineering time stays in the Rust engine where they actually compete.
2524
- Wasp compiles to standard React + Node.js + Prisma, deployed on their own AWS and CI/CD. No lock-in, no restructuring.
2625

@@ -40,7 +39,7 @@ And they're in production. Their first customer is a publisher running 22 local
4039

4140
<ImgWithCaption
4241
source="img/searchcraft-vektron/vektron-documents-onboarding.webp"
43-
alt="Vektron's onboarding screen: import documents from a feed URL, a file, or WordPress"
42+
alt="The onboarding screen: import documents from a feed URL, a file, or WordPress"
4443
caption="The onboarding screen - Searchcraft's design is super cool!"
4544
/>
4645

@@ -50,44 +49,42 @@ They could have built it, but chose not to. The SaaS layer is a hundred solved p
5049

5150
The answer came from inside the house: Don, the CTO, had been following Wasp. [Open SaaS](https://opensaas.sh), Wasp's open-source template, meant auth, payments, and an admin panel existed on day one, as code they own, not services they rent. And they evaluated it like engineers: everything Wasp generates is standard React, Node.js, and Prisma they could read, trust, and run themselves, no magic to open up. **It's their code**, and it compiles to one integrated stack built to keep holding together as the app grows.
5251

53-
## What they built: Vektron
52+
## What they built: the full-stack customer dashboard
5453

55-
Vektron is Searchcraft's control room, "a product within a product," where customers run everything from document ingestion to search tuning, team management, and analytics.
54+
The dashboard is Searchcraft's control room, "a product within a product," where customers run everything from document ingestion to search tuning, team management, and analytics.
5655

57-
> **"Vektron is our Wasp app, it's the user portal. We just like to give things cool code names."**
58-
59-
Three moments show what's actually running under the UI, because Vektron isn't a static admin panel, it's a full-stack app where Wasp is doing real work end to end:
56+
Three moments show what's actually running under the UI, because the dashboard isn't a static admin panel, it's a full-stack app where Wasp is doing real work end to end:
6057

6158
<ImgWithCaption
6259
source="img/searchcraft-vektron/vektron-dashboard-analytics.webp"
63-
alt="Vektron organization dashboard with live usage stats, conversion and retention scores"
60+
alt="Organization dashboard with live usage stats, conversion and retention scores"
6461
caption="What's behind this screen: server-side queries turning raw search events into live stats and multi-tenant access control, all in one Wasp codebase."
6562
/>
6663

6764
<ImgWithCaption
6865
source="img/searchcraft-vektron/vektron-app-searches.webp"
69-
alt="Vektron application view with the index registry and total searches chart"
66+
alt="Application view with the index registry and total searches chart"
7067
caption="What's behind this screen: a multi-tenant index registry in Prisma, kept in sync with the Rust engine over one API, with search events rolled up into the time windows above. The chart is React; the plumbing is Wasp's type-safe operations."
7168
/>
7269

7370
<VideoWithCaption
7471
source="img/searchcraft-vektron/vektron-subscription-settings.mp4"
75-
alt="Vektron organization settings with subscription plans and upgrades"
72+
alt="Organization settings with subscription plans and upgrades"
7673
caption="What's behind this screen: subscription plans and upgrades, the billing machinery every SaaS needs and nobody wants to hand-roll, running in the same Wasp app and wired into the quotas from the first screen."
7774
/>
7875

7976
Around those three screens sits the rest of a real SaaS: an ingestion pipeline that infers the schema as it pulls documents in, crew management with roles, access keys as managed secrets, and a code-snippets page that takes a frontend dev from API key to working search box in minutes. Multi-tenant, role-based, revenue-carrying, and it looks the part. For a search company, the user portal *is* the brand.
8077

8178
## How it runs: Wasp next to Rust
8279

83-
The shape is the interesting part. On one side, the Searchcraft engine and its supporting services (provisioning, ingestion), all Rust, all theirs. On the other, Vektron: a Wasp app (React + Node.js + Prisma) that talks to the engine over an API. Customer apps consume search through the SDKs and never know the portal exists.
80+
The shape is the interesting part. On one side, the Searchcraft engine and its supporting services (provisioning, ingestion), all Rust, all theirs. On the other, the customer dashboard: a Wasp app (React + Node.js + Prisma) that talks to the engine over an API. Customer apps consume search through the SDKs and never know the portal exists.
8481

8582
Here's the architecture, drawn by the Searchcraft team:
8683

8784
<ImgWithCaption
8885
source="img/searchcraft-vektron/searchcraft-architecture.webp"
89-
alt="Architecture diagram: Vektron (Wasp app), Searchcraft Server (Rust), provisioning and ingestion services (Rust), SDKs, customer apps"
90-
caption="Vektron, the Wasp app, handles users, configuration, and analytics; the Searchcraft engine and its Rust services do the search. One API connects them, and customer apps reach search through the SDKs."
86+
alt="Architecture diagram: the customer dashboard (Wasp app), Searchcraft Server (Rust), provisioning and ingestion services (Rust), SDKs, customer apps"
87+
caption="The dashboard, a Wasp app, handles users, configuration, and analytics; the Searchcraft engine and its Rust services do the search. One API connects them, and customer apps reach search through the SDKs."
9188
/>
9289

9390
**Two systems, one product, one API between them.**

web/src/components/WaspOutThere.tsx

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ interface RealApp {
3939
linkText: string;
4040
linkUrl: string;
4141
imageSrc: string;
42+
storyText?: string;
43+
storyUrl?: string;
4244
}
4345

4446
const WaspOutThere = () => {
@@ -247,27 +249,39 @@ const FeaturedTestimonial = () => (
247249
);
248250

249251
const ProjectCard = ({ project }: { project: RealApp }) => (
250-
<Link
251-
to={project.linkUrl}
252-
className="block h-full overflow-hidden border border-wasp-black bg-wasp-white no-underline transition-shadow hover:shadow-md"
253-
>
254-
<img
255-
src={project.imageSrc}
256-
alt={project.name}
257-
className="aspect-video w-full object-cover object-top"
258-
/>
259-
<div className="p-4">
260-
<h4 className="mb-1 font-mono text-base font-bold text-wasp-black">
261-
{project.name}
262-
</h4>
263-
<p className="mb-3 text-sm leading-relaxed text-wasp-g6">
264-
{project.description}
265-
</p>
266-
<span className="font-mono text-xs font-semibold text-wasp-black underline decoration-wasp-yellow decoration-2 underline-offset-2">
252+
<div className="flex h-full flex-col overflow-hidden border border-wasp-black bg-wasp-white transition-shadow hover:shadow-md">
253+
<Link to={project.linkUrl} className="block no-underline hover:no-underline">
254+
<img
255+
src={project.imageSrc}
256+
alt={project.name}
257+
className="aspect-video w-full object-cover object-top"
258+
/>
259+
<div className="px-4 pb-3 pt-4">
260+
<h4 className="mb-1 font-mono text-base font-bold text-wasp-black">
261+
{project.name}
262+
</h4>
263+
<p className="text-sm leading-relaxed text-wasp-g6">
264+
{project.description}
265+
</p>
266+
</div>
267+
</Link>
268+
<div className="mt-auto flex flex-wrap items-center gap-x-4 gap-y-1 px-4 pb-4">
269+
<Link
270+
to={project.linkUrl}
271+
className="font-mono text-xs font-semibold text-wasp-black underline decoration-wasp-yellow decoration-2 underline-offset-2 hover:text-wasp-black hover:decoration-wasp-yellow-dark"
272+
>
267273
{project.linkText}
268-
</span>
274+
</Link>
275+
{project.storyUrl && (
276+
<Link
277+
to={project.storyUrl}
278+
className="inline-flex items-center gap-1 bg-wasp-yellow px-1.5 py-0.5 font-mono text-xs font-semibold text-wasp-black no-underline transition-colors hover:bg-wasp-yellow-dark hover:text-wasp-black hover:no-underline"
279+
>
280+
{project.storyText ?? "read the story →"}
281+
</Link>
282+
)}
269283
</div>
270-
</Link>
284+
</div>
271285
);
272286

273287
/* Bottom action zone of the example-app card: repo link + Demo + See the code. */
@@ -497,6 +511,8 @@ const realApps: RealApp[] = [
497511
linkText: "visit site →",
498512
linkUrl: "https://www.searchcraft.io/",
499513
imageSrc: "/img/lp/examples/searchcraft.webp",
514+
storyText: "read the story →",
515+
storyUrl: "/blog/2026/07/20/made-with-wasp-searchcraft",
500516
},
501517
];
502518

52.5 KB
Loading

0 commit comments

Comments
 (0)