Skip to content
Rubatt

Multi-tenant deep research

Hosted research platform

A single-user research script turned into a multi-tenant platform.

Stack

  • GPT Researcher
  • Railway
  • Supabase
  • PostgreSQL
  • Python

How we built Hosted research platform

The problem

Deep research tooling existed as a single-user script. Making it a product meant every run needed an owner, an audit trail, and isolation from every other tenant. The research engine itself was good and worth keeping, which ruled out the tempting option of rewriting it.

The constraints

  • The research engine had to survive intact, not be rebuilt around a new architecture
  • Jobs run for many minutes, so they could not be tied to a request lifecycle
  • Every artefact a run produced needed an owner, including intermediate state

What we built

A hosted fork with Supabase identity in front of it, per-user scoping through the whole run lifecycle, and deployment on Railway so a long research job does not hold a request open. Users sign in, start runs, and get back reports that belong to them and only them.

The decision that mattered

Threading identity into the runtime, not just the front door

Authenticating at the API boundary is the easy half. The difficulty is that a research run spawns source fetches, intermediate state and a final report, and each of those is an artefact that needs an owner. If identity stops at the front door, the runtime happily writes tenant-agnostic state and you have built a data leak with a login page on it. We threaded the ownership boundary down into the research runtime so every artefact a run touches carries it. The second problem was lifecycle: a job that dies when the process restarts is not a product, so runs had to be durable across redeploys rather than living inside the request that started them.

The outcome

A single-user research script became a multi-tenant platform without rewriting the research engine underneath it. Long-running jobs survive redeploys rather than dying with the process that started them.

Recognise this problem?

The architecture usually transfers even when the sector does not. Tell us what you are trying to automate.