---
title: Portability
description: Hosted ggui and a server you run yourself speak the same protocol — what moves across unchanged, and the few things that differ.
---

Hosted ggui runs the same protocol you can run yourself. There is no hosted-only dialect, no proprietary client library, and no lock-in step you would have to unwind later. If hosted ggui stops suiting you, you point your agent at your own server and keep going.

## What moves unchanged

- **Your agent.** It talks to an MCP endpoint. Change the URL and the credential; nothing else. There is [no client SDK wrapper](/quickstart/hosted-agent/) to swap out, because your agent never imported one.
- **Your contracts.** `DataContract` is protocol, not product. The same `propsSpec` / `actionSpec` / `contextSpec` shapes are accepted by both sides, and the [conformance kit](/protocol/conformance/) is what settles any disagreement.
- **Your blueprints.** Cached blueprints are exportable artefacts. `ggui export-pool` writes a pool you load on another server with `ggui serve --seed-pool <dir>`, so the work of generating them travels with you.
- **Your gadgets.** Published gadgets are content-addressed, signed bundles installed by manifest. They resolve the same way on either side.

## What differs

|                       | Hosted                                       | Your own server                                                            |
| --------------------- | -------------------------------------------- | -------------------------------------------------------------------------- |
| **Model access**      | ggui's credit pool, or your own provider key | Always your own provider key                                               |
| **Billing**           | Prepaid credits, priced per render           | Your provider's bill, directly                                             |
| **Registry endpoint** | The hosted marketplace                       | The hosted marketplace, or [your own registry](/sdk/self-hosted-registry/) |

Credentials do not carry over in either direction: a `ggui_user_*` connector key is meaningless to a server you run, and a self-hosted key is meaningless to `mcp.ggui.ai`. That is the boundary working correctly, not a migration cost.

## Going self-hosted

Start with the [self-hosted quickstart](/quickstart/self-hosted/) — it runs the whole stack locally with no account. When you are ready to put it somewhere, the [reference deploys](/self-hosted/reference-deploys/) cover the shapes that are known to work.