From ink
Background knowledge about the Ink (ml.ink) GraphQL API. Auto-loaded when Claude needs to interact with Ink services, deployments, or the ml.ink platform.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ink:api-referenceThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Ink is a deployment platform at `ml.ink`. All platform operations go through a single GraphQL API.
Ink is a deployment platform at ml.ink. All platform operations go through a single GraphQL API.
POST https://api.ml.ink/graphql
All data queries and mutations require an API key:
Authorization: Bearer <API_KEY>
API key format: dk_live_ followed by 64 hex characters. Users generate them from https://ml.ink → Settings → API Keys.
The key should be in the INK_API_KEY environment variable. Always check $INK_API_KEY before making requests.
Exception: schema introspection requires no authentication.
curl -s https://api.ml.ink/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $INK_API_KEY" \
-d '{"query": "<GRAPHQL>"}' | jq
For mutations with variables:
curl -s https://api.ml.ink/graphql \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $INK_API_KEY" \
-d '{"query": "mutation($input: SomeInput!) { doThing(input: $input) { ... } }", "variables": {"input": {...}}}' | jq
No auth needed. Always introspect the live schema to discover exact field names, types, and arguments before building queries.
# All queries and mutations
curl -s https://api.ml.ink/graphql -H "Content-Type: application/json" \
-d '{"query": "{ __schema { queryType { fields { name args { name type { name kind ofType { name kind ofType { name kind } } } } } } mutationType { fields { name args { name type { name kind ofType { name kind ofType { name kind } } } } } } } }"}' | jq
# Object type fields
curl -s https://api.ml.ink/graphql -H "Content-Type: application/json" \
-d '{"query": "{ __type(name: \"TYPENAME\") { fields { name type { name kind ofType { name kind } } } } }"}' | jq
# Input type fields
curl -s https://api.ml.ink/graphql -H "Content-Type: application/json" \
-d '{"query": "{ __type(name: \"TYPENAME\") { inputFields { name type { name kind ofType { name kind ofType { name kind } } } } } }"}' | jq
# Enum values
curl -s https://api.ml.ink/graphql -H "Content-Type: application/json" \
-d '{"query": "{ __type(name: \"ENUMNAME\") { enumValues { name } } }"}' | jq
Memory (pick one exactly):
128Mi, 256Mi (default), 512Mi, 1024Mi, 2048Mi, 4096Mi
vCPUs (pick one exactly):
0.25 (default), 0.5, 1, 2, 3, 4
Build packs:
railpack (default) — universal auto-detection for Node.js, Python, Go, Rust, Ruby, PHP, Elixir, etc.dockerfile — custom Dockerfilestatic — static site served by nginx on port 8080dockercompose — Docker ComposeGit providers (the host field):
github (default) — GitHub repos, requires Ink GitHub App installedinternal — internal git at git.ml.inkqueued → building → deploying → active
↘ failed
↘ crashed
queued — waiting to buildbuilding — actively building container imagedeploying — image built, waiting for k8s rollout + health checkactive — serving trafficfailed — build or deploy failed (check error message + build logs)crashed — container exited after starting (check runtime logs)suspended — paused by billing or adminsuperseded — replaced by a newer deploymentcancelled — deployment cancelled in-flightIf the service name doesn't exist, it creates a new service. If it exists, it updates config and triggers an immediate redeploy. Only provided fields are updated (partial update). In-flight deployments are automatically cancelled.
buildpack=static): always port 8080, user port ignored80803000EXPOSE in Dockerfile0.0.0.0, not 127.0.0.1 or localhostPORT is auto-injected with the resolved port valueenvVars in an update replaces the entire set — always include all vars, not just new ones[{"key": "...", "value": "..."}]owner/repo (not full URL, not git@ format)ink/repoName/).. allowedpublishDirectory only valid with buildpack=railpackdockerfilePath only valid with buildpack=dockerfilegit.ml.inkmlg_<base64> (distinct from API keys)git.ml.ink/users/{username}/{repoName}-{slug}sqlite (Turso-backed)libsql://...) and auth token@libsql/client (Node.js), libsql-experimental (Python)free — max 2 vCPU, 4GB RAM, 5 serviceshobby — max 10 vCPU, 20GB RAM, 25 servicespro — max 40 vCPU, 80GB RAM, 200 servicesMetering: $0.000463/vCPU-min, $0.000231/GB-min, $0.05/GB egress. Billing values in API are in cents — divide by 100 for dollars.
List queries use cursor-based pagination: first (page size), after (cursor from pageInfo.endCursor). Check pageInfo.hasNextPage.
Many queries accept workspaceSlug. Omit for the user's default personal workspace. Personal workspace slug = user ID.
Every workspace has a default project created on signup. Services without an explicit project go there.
If the commit SHA and build config haven't changed, the existing image is reused (no rebuild).
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub opensitesai/claude-code-ink