Cityverse
A virtual tourism platform for Qatar — 360° tours, an AI guide, and a token marketplace, sold as SaaS.
- Role
- Lead Software Engineer
- Status
- shipped
Problem
Qatar draws visitors who decide where to go before they arrive, and operators had no way to let them walk a venue first. Cityverse puts the venue on the web as a navigable 360° space, adds a guide that can answer questions inside that space, and gives operators a way to sell access to it.
Architecture
Read this diagram as text
- Next.js client mounts Three.js 360° viewer
- Three.js 360° viewer streams panoramas Azure Blob Storage
- Next.js client connects to Application API
- Application API prompt + context AI guide
- Application API connects to Token marketplace
- Token marketplace checkout SkipCash
- Application API connects to Application database
- Application API signed upload Azure Blob Storage
- Docker on VPS hosts Application API
Engineering decisions
- Three.jsThe 360° tour is the product, so it renders in the browser rather than as pre-baked video.
- Azure Blob StoragePanoramas are large, static and read far more often than written — object storage rather than anything in the request path.
- SkipCashQatar-local gateway. A venue selling access to Qatari customers needs a processor those customers already trust.
- DockerSelf-hosted on a VPS, so the deploy has to be reproducible without a platform doing it for you.
Also in the stack, reasoning not written up yet:
Next.js · Azure OpenAI · VPS
The hard part
The guide was the part that nearly did not work. A model answering questions inside a venue will answer them about any venue unless something stops it, and early versions cheerfully described rooms that were not in the tour. The fix was to stop treating it as a chat window bolted onto the page: the viewer tells the API which venue and which scene the visitor is standing in, and the prompt is built from that venue's own content, so a question has a subject before the model ever sees it. Panoramas needed the opposite discipline — a venue's worth of equirectangular images will not sit in a phone's texture memory at once, so scenes stream from Blob storage as they are entered rather than loading with the tour.
Result
Shipped as the end-of-studies project and sold to operators as SaaS: a venue is published as a navigable 360° space, visitors put questions to the guide inside it, and access is sold as tokens through SkipCash. Panoramas are served from Azure Blob Storage and the platform runs in Docker on a VPS, with an AI-assisted editor for building a tour on top of it.
