FM Consulting
Knowledge Portal
A self-service help center with real full-text search (not AI) — publish Markdown articles, search them by BM25 relevance ranking, and let every zero-result search and helpfulness vote surface exactly which articles are missing or failing.
Case study
The problem
A help center is only as good as two things most teams never actually measure: whether search finds the right article, and whether the article that's found actually helps. Most knowledge-base tools ship a search box and stop there — there's no record of what people searched for and came up empty, and no signal on which published articles are quietly failing their readers. Content teams end up guessing what to write next instead of knowing.
The solution
Every search runs against a real full-text index and every result is ranked by actual relevance, not a static list. Every search query is logged with its result count and whether a result was clicked, and every published article carries a "was this helpful?" vote. An analytics view turns that log into three concrete answers: which searches are coming up completely empty (a direct list of content to write next), which searches are most common (where to focus first), and which existing articles have a low helpful rate (candidates for a rewrite, not just a guess). During development this loop caught a genuine, unplanted example of its own value: a seeded article titled "Setting Up Single Sign-On (SSO)" didn't match the search "sso setup" at all, because the word "setup" never actually appears in the title — exactly the kind of real vocabulary mismatch the zero-result report exists to surface.
How it was built
Search runs on SQLite's FTS5 full-text index with BM25 relevance ranking (title matches weighted ten times body matches), kept in sync with the articles table entirely by database triggers — the authoring code that creates, edits, and publishes articles never touches the search index directly, and only published articles are ever indexed, so a draft never leaks into search results. This is a deliberate technical contrast to a companion project on this site that uses AI embeddings for semantic search: this one uses lexical full-text matching instead, on the reasoning that a well-titled help center is a genuinely good fit for real keyword search — instant, free per query, and with a zero-result report that surfaces exactly the vocabulary gaps a semantic search would have silently smoothed over. Search-result snippets are built from live article text and rendered directly into the page, which meant treating that text as untrusted: since anyone can author an article with no auth layer yet in place, the snippet-highlighting path HTML-escapes the underlying text before re-inserting the highlight markup, verified by planting an actual script-injection payload in a test article and confirming it rendered as inert text rather than executing.
More projects

- Customer Experience
- Platform
Customer Portal Improvement Program
A self-service account portal for team, plan, and billing management — paired with an internal account-health view that scores churn risk from real usage data, not guesswork.

- Platform
- Customer Experience
Community Event Coordination Platform
A private, invite-only event coordination platform for a closed group — poll-first event planning with real-time collaborative voting, a venue leaderboard, and an installable mobile experience.

- AI
- Customer Experience
AI Support Workflow Optimization
A platform-agnostic AI triage layer for support teams — connects to Zendesk, Salesforce, or any ticketing system, classifying tickets and drafting ready-to-send responses with a human review step before anything goes out.