Skip to main content
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.
SettingValue
Default API URLhttps://api.aiohub.org
API keyYour AIOHub sk- API key
API interfaceImages API (/v1/images)
Model IDgpt-image-2
Codex CLIEnable for codex* groups; disable for the openai group
Timeout360-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:
http://your-server:8080
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:
docker compose up -d
Watch logs:
docker logs -f gip
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.