Generated images are saved only in the current browser. They are not automatically stored on your server or on AIOHub servers. Clearing browser data removes image history, so download any results you want to keep.
Self-host GIP when you need a custom domain, internal access, a team-owned entry point, or access controls. Docker is the recommended deployment path: you do not need to modify source code, and upgrades or rollbacks stay simple.
GIP is a browser image client. Authentication, billing, and logs still go through AIOHub with your AIOHub API key.
The upstream project is CookSleep/gpt_image_playground. Before deploying it for other users, confirm that you trust your server environment and use a dedicated API key for this browser client.
Recommended configuration
| Setting | Value |
|---|
| Default API URL | https://api.aiohub.org |
| API key | Your AIOHub sk- API key |
| API interface | Images API (/v1/images) |
| Model ID | gpt-image-2 |
| Codex CLI | Enable for codex* groups; disable for the openai group |
| Timeout | 360-600 seconds |
Start with Docker
Install Docker on your server, then run:
docker run -d \
--name gip \
--restart unless-stopped \
-p 8080:80 \
-e DEFAULT_API_URL=https://api.aiohub.org \
ghcr.io/cooksleep/gpt_image_playground:latest
Open:
Open GIP settings, enter your AIOHub API key, choose Images API, and set the model to gpt-image-2.
DEFAULT_API_URL only pre-fills the API URL in GIP. Each user still needs to enter their own API key in the page.
Docker Compose
If you manage services with Compose, create docker-compose.yml:
services:
gip:
image: ghcr.io/cooksleep/gpt_image_playground:latest
container_name: gip
restart: unless-stopped
ports:
- "8080:80"
environment:
DEFAULT_API_URL: "https://api.aiohub.org"
Start it:
Watch logs:
Update it:
docker compose pull
docker compose up -d
Optional: bind a domain
If you only use GIP temporarily for yourself, you can open http://your-server:8080 directly. You do not need to bind a domain.
If you plan to share it with multiple users or a team, consider binding an HTTPS domain and reverse proxying it to container port 8080 with Nginx, Caddy, or your server panel. A fixed domain is easier to share, and it lets you add login, an IP allowlist, or private network access at the reverse proxy layer.
Nginx example:
server {
listen 443 ssl http2;
server_name image.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
If this site is only for your team, add at least login, an IP allowlist, or private network access at the reverse proxy layer.
Optional: enable same-origin API proxy
By default, the browser calls https://api.aiohub.org directly. You usually do not need the same-origin API proxy in GIP.
Only add these environment variables when you explicitly want your own server to forward requests:
services:
gip:
image: ghcr.io/cooksleep/gpt_image_playground:latest
restart: unless-stopped
ports:
- "8080:80"
environment:
DEFAULT_API_URL: "https://api.aiohub.org"
ENABLE_API_PROXY: "true"
API_PROXY_URL: "https://api.aiohub.org"
If you enable the same-origin API proxy, anyone who can access the site may be able to forward requests through your server. Only enable it behind login, an IP allowlist, private network access, or another access control layer.
Next steps
After deployment, configure GIP the same way as the embedded version. See the Embedded GPT Image Playground (GIP) setup values for the AIOHub API key, Images API mode, gpt-image-2, Codex CLI switch, and timeout.
If you enable the same-origin API proxy, keep login, an IP allowlist, private network access, or another access control layer in place for your self-hosted site.