I didn't set out to build a product. I built this for myself, and the reason is small and specific.
Other AI tools have gotten dramatically better over the last couple of years, and the complaint isn't that they won't stick to one source. Ask one to answer only from a particular website and it mostly will — that site's pages are indexed, and it can reach them.
The problem starts where the index stops.
Think of a site with a thousand PDFs on it — a research library, a manuals archive, years of annual reports. A general AI tool can find the page that lists those files. It can't read across them. Some are indexed shallowly, many aren't indexed at all, and the scanned ones have no text in them to index in the first place. You can upload one PDF into a chat and ask about it — I do that all the time — but that's one file, in one conversation, for me. It isn't a searchable body of knowledge, and nobody else can use it.
Video is worse. One channel I follow has hundreds of videos, plenty of them over an hour long. The answer I wanted was somewhere around minute 43 of a video whose title and description never mention it. The title, description, and chapter markers get indexed. What's actually said at minute 43 doesn't — not in any way a general tool can search. So you either remember roughly where it was, or you scrub through and hope.
So I built a small thing for myself: point it at the videos and documents I trust, ask a question, get an answer with the exact timestamp or the exact page. I shared it with a few friends and they used it more than I expected. No revenue, no customers, no plan — just a tool that solved my own problem.
The realization came later and was obvious in hindsight: that gap isn't mine, it's structural. General AI tools are excellent at everything the index can reach and blind to everything it can't — and the moment knowledge lives in a pile of documents or hours of video, it can't. Which means anyone sitting on a body of content has this exact problem pointed at their own audience: a business with its documentation, a non-profit with material to distribute, an academy with recorded lectures, a creator with a back catalogue.
What's actually under the hood
Content gets chunked and embedded with BAAI/bge-m3, stored in a separate vector collection per tenant — no shared index across customers. At query time, it's retrieved and reranked, then the top passages are passed as context to a generation model, with a fallback chain across providers so one outage doesn't take the whole thing down.
Documents that are scanned rather than text-based go through an OCR cascade rather than silently returning nothing. Video transcripts come from captions where they exist and speech-to-text where they don't. Every tenant gets its own database, not just its own rows in a shared one.
The part I care most about: answers are confined to that tenant's content and always attributable. If it can't find support in the material, it says so rather than filling the gap. Citations point at the specific page or the specific moment, not just "somewhere in this document."
Is this just a wrapper around a model?
Worth answering directly rather than dodging it: the generation model is one component, and it's swappable. The retrieval, the per-tenant isolation, citation-to-exact-page-or-timestamp, the OCR and transcription cascades, and the branding/domain/billing layer on top are the actual product.
Where it ended up
About two months of evenings and weekends around a full-time software job — six years as an engineer — from the thing I built for myself to the thing anyone can sign up for. Multi-tenant, so you bring your own PDFs, DOCX files, or a YouTube channel, and it comes with an embeddable widget so you're not sending people to a separate site to ask a question.
The result is your own branded AI, on your own domain, trained only on your content, answering only from it, citing the exact page of a document or the exact moment in a video. It's live at ultranivo.com.
Happy to answer anything — the retrieval setup, the multi-tenant design, the OCR/transcription cascades, or what I'd do differently.
Top comments (0)