{"id":53668,"plugin_id":"plugins_6ac012b82680819195f8a26cbe32c246","kind":"skill","collection_source":"skill_api","comparison_source":null,"observed_at":"2026-10-24T13:54:48.577Z","digest":"bd8f602a47fe3b8c754a151352de5a62793f74c56a72d877b9f4b4c3050e650b","against":null,"payload":{"description":"Deploy web applications to Domino Data Lab with expertise in React apps (Vite) behind Domino's reverse proxy. Covers app.sh configuration, port configuration, base path handling for SPAs, CI/CD with GitHub Actions, and proxy troubleshooting. Use when deploying apps to Domino, setting up CI/CD pipelines, fixing broken routing, or configuring JavaScript frameworks for Domino's proxy.","included_files":[{"relative_path":"API-APPS.md","size_in_bytes":4268},{"relative_path":"FRAMEWORKS.md","size_in_bytes":12448},{"relative_path":"REACT-CICD.md","size_in_bytes":9934},{"relative_path":"REACT-VITE-GUIDE.md","size_in_bytes":6230},{"relative_path":"TROUBLESHOOTING.md","size_in_bytes":7439}],"name":"domino-apps","skill_md_contents":"---\nname: domino-apps\ndescription: Deploy web applications to Domino Data Lab with expertise in React apps (Vite) behind Domino's reverse proxy. Covers app.sh configuration, port configuration, base path handling for SPAs, CI/CD with GitHub Actions, and proxy troubleshooting. Use when deploying apps to Domino, setting up CI/CD pipelines, fixing broken routing, or configuring JavaScript frameworks for Domino's proxy.\n---\n\n# Domino Apps Skill\n\nThis skill provides comprehensive knowledge for deploying web applications to Domino Data Lab, with special focus on React applications using Vite.\n\n## Key Concepts\n\n### Domino App Architecture\n\nDomino apps run in containers behind a reverse proxy that:\n1. Authenticates users via Domino's auth system\n2. Strips the URL prefix before forwarding to your app\n3. Routes traffic to your app container\n4. Handles infrastructure provisioning, routing, and resource management\n\n**Note:** Port selection is flexible; port 8888 is no longer required. You can use any port your application prefers.\n\n### Critical Configuration Points\n\n1. **Host Binding**: Bind to `0.0.0.0` (not localhost) so Domino can reach your app\n2. **Relative Base Path**: Use `base: './'` in Vite config for React apps\n3. **app.sh**: Entry point script (launch file) that Domino executes\n\n## Related Documentation\n\n- [API-APPS.md](./API-APPS.md) - REST automation: v1 vs beta, publish chain, management vs app URL, inference split\n- [REACT-VITE-GUIDE.md](./REACT-VITE-GUIDE.md) - Deep dive into Vite + React configuration\n- [REACT-CICD.md](./REACT-CICD.md) - CI/CD setup with GitHub Actions\n- [FRAMEWORKS.md](./FRAMEWORKS.md) - Streamlit, Dash, Flask configurations\n- [TROUBLESHOOTING.md](./TROUBLESHOOTING.md) - Common issues and solutions\n\n## Quick Start\n\n### React with Vite\n\n```javascript\n// vite.config.js\nimport { defineConfig } from 'vite'\nimport react from '@vitejs/plugin-react'\n\nexport default defineConfig({\n  plugins: [react()],\n  base: './',  // CRITICAL for Domino proxy\n  server: { host: '0.0.0.0', port: 8888, strictPort: true },\n  preview: { host: '0.0.0.0', port: 8888, strictPort: true },\n})\n```\n\n```bash\n# app.sh\n#!/bin/bash\nset -e\ncd /mnt/code\nnpm ci\nnpm run build\nnpx serve -s dist -l 8888 --no-clipboard\n```\n\n### Streamlit\n\n```bash\n# app.sh\n#!/bin/bash\nstreamlit run app.py --server.port 8888 --server.address 0.0.0.0\n```\n\n### Dash/Flask\n\n```bash\n# app.sh\n#!/bin/bash\npython app.py  # Must bind to 0.0.0.0:8888\n```\n\n## Environment Variables\n\nDomino provides these environment variables to your app:\n\n| Variable | Description |\n|----------|-------------|\n| `DOMINO_PROJECT_NAME` | Current project name |\n| `DOMINO_PROJECT_OWNER` | Project owner username |\n| `DOMINO_RUN_ID` | Current run identifier |\n| `DOMINO_STARTING_USERNAME` | User who started the app |\n\n## Inter-App Communication\n\nDomino apps can communicate with each other using bearer token authentication. This is useful for:\n- Calling Model APIs from an app\n- App-to-app service calls\n- Accessing internal Domino services\n\n### Getting the Access Token\n\nDomino provides an access token service at `localhost:8899`:\n\n```python\nimport requests\n\n# Get bearer token for inter-app communication\nAPI_TOKEN = requests.get(\"http://localhost:8899/access-token\").text\n```\n\n### Making Authenticated Requests\n\n```python\nimport requests\n\n# 1. Get access token from Domino's token service\nAPI_TOKEN = requests.get(\"http://localhost:8899/access-token\").text\n\n# 2. Set up headers with bearer token\nheaders = {\n    \"Authorization\": f\"Bearer {API_TOKEN}\",\n    \"Content-Type\": \"application/json\"\n}\n\n# 3. Make request to another Domino app or service\npayload = {\n    \"query\": \"Your request data here\"\n}\n\ntry:\n    resp = requests.post(\n        \"https://your-domino-instance/apps-internal/APP_ID/endpoint\",\n        json=payload,\n        headers=headers,\n        timeout=100\n    )\n    resp.raise_for_status()\n    data = resp.json()\n    print(data)\nexcept requests.exceptions.RequestException as err:\n    print(\"API call failed:\", err)\n```\n\n### Key Points\n\n- **Token endpoint**: `http://localhost:8899/access-token` (only accessible from within Domino)\n- **Token type**: Bearer token for Authorization header\n- **Use cases**: Model API calls, app-to-app communication, internal services\n- **Timeout**: Set appropriate timeouts for long-running requests\n\n## REST automation (apps API)\n\nFor create, publish, start, and stop from code, read [API-APPS.md](./API-APPS.md). Use `/api/apps/v1` for writes; use `/api/apps/beta` only for instance logs, views, and runtime telemetry.\n\n## API Reference\n\nOpenAPI and route discovery: [API-SPECS.md](../domino-api-intro/API-SPECS.md) (public routes section).\n\n### API Version Prioritization Rules\n\n- **Prioritize the Apps v1 API (`/api/apps/v1`)** for all apps creation, update, preview, publication, start and stop workflows. \n- **The Beta API (`/api/apps/beta`) is deprecated** for new automation and maintained for backward compatibility and runtime reads. Do not build new functionality against `beta` endpoints if a `v1` equivalent exists.\n- **Instance Read Operations Exception**: Instance read operations (such as fetching active container logs, `realTimeLogs`, `views`, listing active running instances, or issuing an instance-level `DELETE`) were not migrated to the `v1` spec. They remain under `/api/apps/beta`.\n\n*Rule of Thumb:* Use `v1` for automating write or publish actions. Fall back to `beta` for streaming runtime telemetry like logs or views.\n\n**Authentication:** https://docs.domino.ai/cloud/reference/api/domino-api-authentication . In-run: `DOMINO_API_PROXY` (no Authorization header) or `DOMINO_USER_HOST` + `http://localhost:8899/access-token`. Outside run: public deployment URL + PAT/SA. Do not use API keys.\n\n**Get the cluster base URL:** `$DOMINO_USER_HOST` or `$DOMINO_API_HOST` in-run; confirm apps routes with `GET .../api/apps/v1/apps?limit=1`.\n\n**Public docs:**\n- https://docs.domino.ai/cloud/platform-capabilities/features/apps\n\n**Blueprint Reference:**\n- [React CI/CD Blueprint](https://github.com/dominodatalab/domino-blueprints/tree/main/React-app-deployment-with-CICD)\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}