{"id":"5575cecd-6689-4607-a21f-53094518ddf8","shortId":"GAwb3T","kind":"skill","title":"Gcp Cloud Run","tagline":"Antigravity Awesome Skills skill by Sickn33","description":"# GCP Cloud Run\n\nSpecialized skill for building production-ready serverless applications on GCP.\nCovers Cloud Run services (containerized), Cloud Run Functions (event-driven),\ncold start optimization, and event-driven architecture with Pub/Sub.\n\n## Principles\n\n- Cloud Run for containers, Functions for simple event handlers\n- Optimize for cold starts with startup CPU boost and min instances\n- Set concurrency based on workload (start with 8, adjust)\n- Memory includes /tmp filesystem - plan accordingly\n- Use VPC Connector only when needed (adds latency)\n- Containers should start fast and be stateless\n- Handle signals gracefully for clean shutdown\n\n## Patterns\n\n### Cloud Run Service Pattern\n\nContainerized web service on Cloud Run\n\n**When to use**: Web applications and APIs,Need any runtime or library,Complex services with multiple endpoints,Stateless containerized workloads\n\n```dockerfile\n# Dockerfile - Multi-stage build for smaller image\nFROM node:20-slim AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\n\nFROM node:20-slim\nWORKDIR /app\n\n# Copy only production dependencies\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY src ./src\nCOPY package.json ./\n\n# Cloud Run uses PORT env variable\nENV PORT=8080\nEXPOSE 8080\n\n# Run as non-root user\nUSER node\n\nCMD [\"node\", \"src/index.js\"]\n```\n\n```javascript\n// src/index.js\nconst express = require('express');\nconst app = express();\n\napp.use(express.json());\n\n// Health check endpoint\napp.get('/health', (req, res) => {\n  res.status(200).send('OK');\n});\n\n// API routes\napp.get('/api/items/:id', async (req, res) => {\n  try {\n    const item = await getItem(req.params.id);\n    res.json(item);\n  } catch (error) {\n    console.error('Error:', error);\n    res.status(500).json({ error: 'Internal server error' });\n  }\n});\n\n// Graceful shutdown\nprocess.on('SIGTERM', () => {\n  console.log('SIGTERM received, shutting down gracefully');\n  server.close(() => {\n    console.log('Server closed');\n    process.exit(0);\n  });\n});\n\nconst PORT = process.env.PORT || 8080;\nconst server = app.listen(PORT, () => {\n  console.log(`Server listening on port ${PORT}`);\n});\n```\n\n```yaml\n# cloudbuild.yaml\nsteps:\n  # Build the container image\n  - name: 'gcr.io/cloud-builders/docker'\n    args: ['build', '-t', 'gcr.io/$PROJECT_ID/my-service:$COMMIT_SHA', '.']\n\n  # Push the container image\n  - name: 'gcr.io/cloud-builders/docker'\n    args: ['push', 'gcr.io/$PROJECT_ID/my-service:$COMMIT_SHA']\n\n  # Deploy to Cloud Run\n  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'\n    entrypoint: gcloud\n    args:\n      - 'run'\n      - 'deploy'\n      - 'my-service'\n      - '--image=gcr.io/$PROJECT_ID/my-service:$COMMIT_SHA'\n      - '--region=us-central1'\n      - '--platform=managed'\n      - '--allow-unauthenticated'\n      - '--memory=512Mi'\n      - '--cpu=1'\n      - '--min-instances=1'\n      - '--max-instances=100'\n      - '--concurrency=80'\n      - '--cpu-boost'\n\nimages:\n  - 'gcr.io/$PROJECT_ID/my-service:$COMMIT_SHA'\n```\n\n### Structure\n\nproject/\n├── Dockerfile\n├── .dockerignore\n├── src/\n│   ├── index.js\n│   └── routes/\n├── package.json\n└── cloudbuild.yaml\n\n### Gcloud_deploy\n\n# Direct gcloud deployment\ngcloud run deploy my-service \\\n  --source . \\\n  --region us-central1 \\\n  --allow-unauthenticated \\\n  --memory 512Mi \\\n  --cpu 1 \\\n  --min-instances 1 \\\n  --max-instances 100 \\\n  --concurrency 80 \\\n  --cpu-boost\n\n### Cloud Run Functions Pattern\n\nEvent-driven functions (formerly Cloud Functions)\n\n**When to use**: Simple event handlers,Pub/Sub message processing,Cloud Storage triggers,HTTP webhooks\n\n```javascript\n// HTTP Function\n// index.js\nconst functions = require('@google-cloud/functions-framework');\n\nfunctions.http('helloHttp', (req, res) => {\n  const name = req.query.name || req.body.name || 'World';\n  res.send(`Hello, ${name}!`);\n});\n```\n\n```javascript\n// Pub/Sub Function\nconst functions = require('@google-cloud/functions-framework');\n\nfunctions.cloudEvent('processPubSub', (cloudEvent) => {\n  // Decode Pub/Sub message\n  const message = cloudEvent.data.message;\n  const data = message.data\n    ? JSON.parse(Buffer.from(message.data, 'base64').toString())\n    : {};\n\n  console.log('Received message:', data);\n\n  // Process message\n  processMessage(data);\n});\n```\n\n```javascript\n// Cloud Storage Function\nconst functions = require('@google-cloud/functions-framework');\n\nfunctions.cloudEvent('processStorageEvent', async (cloudEvent) => {\n  const file = cloudEvent.data;\n\n  console.log(`Event: ${cloudEvent.type}`);\n  console.log(`Bucket: ${file.bucket}`);\n  console.log(`File: ${file.name}`);\n\n  if (cloudEvent.type === 'google.cloud.storage.object.v1.finalized') {\n    await processUploadedFile(file.bucket, file.name);\n  }\n});\n```\n\n```bash\n# Deploy HTTP function\ngcloud functions deploy hello-http \\\n  --gen2 \\\n  --runtime nodejs20 \\\n  --trigger-http \\\n  --allow-unauthenticated \\\n  --region us-central1\n\n# Deploy Pub/Sub function\ngcloud functions deploy process-messages \\\n  --gen2 \\\n  --runtime nodejs20 \\\n  --trigger-topic my-topic \\\n  --region us-central1\n\n# Deploy Cloud Storage function\ngcloud functions deploy process-uploads \\\n  --gen2 \\\n  --runtime nodejs20 \\\n  --trigger-event-filters=\"type=google.cloud.storage.object.v1.finalized\" \\\n  --trigger-event-filters=\"bucket=my-bucket\" \\\n  --region us-central1\n```\n\n### Cold Start Optimization Pattern\n\nMinimize cold start latency for Cloud Run\n\n**When to use**: Latency-sensitive applications,User-facing APIs,High-traffic services\n\n## 1. Enable Startup CPU Boost\n\n```bash\ngcloud run deploy my-service \\\n  --cpu-boost \\\n  --region us-central1\n```\n\n## 2. Set Minimum Instances\n\n```bash\ngcloud run deploy my-service \\\n  --min-instances 1 \\\n  --region us-central1\n```\n\n## 3. Optimize Container Image\n\n```dockerfile\n# Use distroless for minimal image\nFROM node:20-slim AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\n\nFROM gcr.io/distroless/nodejs20-debian12\nWORKDIR /app\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY src ./src\nCMD [\"src/index.js\"]\n```\n\n## 4. Lazy Initialize Heavy Dependencies\n\n```javascript\n// Lazy load heavy libraries\nlet bigQueryClient = null;\n\nfunction getBigQueryClient() {\n  if (!bigQueryClient) {\n    const { BigQuery } = require('@google-cloud/bigquery');\n    bigQueryClient = new BigQuery();\n  }\n  return bigQueryClient;\n}\n\n// Only initialize when needed\napp.get('/api/analytics', async (req, res) => {\n  const client = getBigQueryClient();\n  const results = await client.query({...});\n  res.json(results);\n});\n```\n\n## 5. Increase Memory (More CPU)\n\n```bash\n# Higher memory = more CPU during startup\ngcloud run deploy my-service \\\n  --memory 1Gi \\\n  --cpu 2 \\\n  --region us-central1\n```\n\n### Optimization_impact\n\n- Startup_cpu_boost: 50% faster cold starts\n- Min_instances: Eliminates cold starts for traffic spikes\n- Distroless_image: Smaller attack surface, faster pull\n- Lazy_init: Defers heavy loading to first request\n\n### Concurrency Configuration Pattern\n\nProper concurrency settings for Cloud Run\n\n**When to use**: Need to optimize instance utilization,Handle traffic spikes efficiently,Reduce cold starts\n\n## Understanding Concurrency\n\n```bash\n# Default concurrency is 80\n# Adjust based on your workload\n\n# For I/O-bound workloads (most web apps)\ngcloud run deploy my-service \\\n  --concurrency 80 \\\n  --cpu 1\n\n# For CPU-bound workloads\ngcloud run deploy my-service \\\n  --concurrency 1 \\\n  --cpu 1\n\n# For memory-intensive workloads\ngcloud run deploy my-service \\\n  --concurrency 10 \\\n  --memory 2Gi\n```\n\n## Node.js Concurrency\n\n```javascript\n// Node.js is single-threaded but handles I/O concurrently\n// Use async/await for all I/O operations\n\n// GOOD - async I/O\napp.get('/api/data', async (req, res) => {\n  const [users, products] = await Promise.all([\n    fetchUsers(),\n    fetchProducts()\n  ]);\n  res.json({ users, products });\n});\n\n// BAD - blocking operation\napp.get('/api/compute', (req, res) => {\n  const result = heavyCpuOperation(); // Blocks other requests!\n  res.json(result);\n});\n```\n\n## Python Concurrency with Gunicorn\n\n```dockerfile\nFROM python:3.11-slim\nWORKDIR /app\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\nCOPY . .\n\n# 4 workers for concurrency\nCMD exec gunicorn --bind :$PORT --workers 4 --threads 2 main:app\n```\n\n```python\n# main.py\nfrom flask import Flask\napp = Flask(__name__)\n\n@app.route('/api/data')\ndef get_data():\n    return {'status': 'ok'}\n```\n\n### Concurrency_guidelines\n\n- Concurrency=1: Only for CPU-bound or unsafe code\n- Concurrency=8 20: Memory-intensive workloads\n- Concurrency=80: Default, good for I/O-bound\n- Concurrency=250: Maximum, for very lightweight handlers\n\n### Pub/Sub Integration Pattern\n\nEvent-driven processing with Cloud Pub/Sub\n\n**When to use**: Asynchronous message processing,Decoupled microservices,Event-driven architecture\n\n## Push Subscription to Cloud Run\n\n```bash\n# Create topic\ngcloud pubsub topics create orders\n\n# Create push subscription to Cloud Run\ngcloud pubsub subscriptions create orders-push \\\n  --topic orders \\\n  --push-endpoint https://my-service-xxx.run.app/pubsub \\\n  --ack-deadline 600\n```\n\n```javascript\n// Handle Pub/Sub push messages\nconst express = require('express');\nconst app = express();\napp.use(express.json());\n\napp.post('/pubsub', async (req, res) => {\n  // Verify the request is from Pub/Sub\n  if (!req.body.message) {\n    return res.status(400).send('Invalid Pub/Sub message');\n  }\n\n  try {\n    // Decode message data\n    const message = req.body.message;\n    const data = message.data\n      ? JSON.parse(Buffer.from(message.data, 'base64').toString())\n      : {};\n\n    console.log('Processing order:', data);\n\n    await processOrder(data);\n\n    // Return 200 to acknowledge\n    res.status(200).send('OK');\n  } catch (error) {\n    console.error('Processing failed:', error);\n    // Return 500 to trigger retry\n    res.status(500).send('Processing failed');\n  }\n});\n```\n\n## Publishing Messages\n\n```javascript\nconst { PubSub } = require('@google-cloud/pubsub');\nconst pubsub = new PubSub();\n\nasync function publishOrder(order) {\n  const topic = pubsub.topic('orders');\n  const messageBuffer = Buffer.from(JSON.stringify(order));\n\n  const messageId = await topic.publishMessage({\n    data: messageBuffer,\n    attributes: {\n      type: 'order_created',\n      priority: 'high'\n    }\n  });\n\n  console.log(`Published message ${messageId}`);\n  return messageId;\n}\n```\n\n## Dead Letter Queue\n\n```bash\n# Create DLQ topic\ngcloud pubsub topics create orders-dlq\n\n# Update subscription with DLQ\ngcloud pubsub subscriptions update orders-push \\\n  --dead-letter-topic orders-dlq \\\n  --max-delivery-attempts 5\n```\n\n### Cloud SQL Connection Pattern\n\nConnect Cloud Run to Cloud SQL securely\n\n**When to use**: Need relational database,Migrating existing applications,Complex queries and transactions\n\n```bash\n# Deploy with Cloud SQL connection\ngcloud run deploy my-service \\\n  --add-cloudsql-instances PROJECT:REGION:INSTANCE \\\n  --set-env-vars INSTANCE_CONNECTION_NAME=\"PROJECT:REGION:INSTANCE\" \\\n  --set-env-vars DB_NAME=\"mydb\" \\\n  --set-env-vars DB_USER=\"myuser\"\n```\n\n```javascript\n// Using Unix socket connection\nconst { Pool } = require('pg');\n\nconst pool = new Pool({\n  user: process.env.DB_USER,\n  password: process.env.DB_PASS,\n  database: process.env.DB_NAME,\n  // Cloud SQL connector uses Unix socket\n  host: `/cloudsql/${process.env.INSTANCE_CONNECTION_NAME}`,\n  max: 5,  // Connection pool size\n  idleTimeoutMillis: 30000,\n  connectionTimeoutMillis: 10000,\n});\n\napp.get('/api/users', async (req, res) => {\n  const client = await pool.connect();\n  try {\n    const result = await client.query('SELECT * FROM users LIMIT 100');\n    res.json(result.rows);\n  } finally {\n    client.release();\n  }\n});\n```\n\n```python\n# Python with SQLAlchemy\nimport os\nfrom sqlalchemy import create_engine\n\ndef get_engine():\n    instance_connection_name = os.environ[\"INSTANCE_CONNECTION_NAME\"]\n    db_user = os.environ[\"DB_USER\"]\n    db_pass = os.environ[\"DB_PASS\"]\n    db_name = os.environ[\"DB_NAME\"]\n\n    engine = create_engine(\n        f\"postgresql+pg8000://{db_user}:{db_pass}@/{db_name}\",\n        connect_args={\n            \"unix_sock\": f\"/cloudsql/{instance_connection_name}/.s.PGSQL.5432\"\n        },\n        pool_size=5,\n        max_overflow=2,\n        pool_timeout=30,\n        pool_recycle=1800,\n    )\n    return engine\n```\n\n### Best_practices\n\n- Use connection pooling (max 5-10 per instance)\n- Set appropriate idle timeouts\n- Handle connection errors gracefully\n- Consider Cloud SQL Proxy for local development\n\n### Secret Manager Integration\n\nSecurely manage secrets in Cloud Run\n\n**When to use**: API keys, database passwords,Service account keys,Any sensitive configuration\n\n```bash\n# Create secret\necho -n \"my-secret-value\" | gcloud secrets create my-secret --data-file=-\n\n# Mount as environment variable\ngcloud run deploy my-service \\\n  --update-secrets=API_KEY=my-secret:latest\n\n# Mount as file volume\ngcloud run deploy my-service \\\n  --update-secrets=/secrets/api-key=my-secret:latest\n```\n\n```javascript\n// Access mounted as environment variable\nconst apiKey = process.env.API_KEY;\n\n// Access mounted as file\nconst fs = require('fs');\nconst apiKey = fs.readFileSync('/secrets/api-key', 'utf8');\n\n// Access via Secret Manager API (when not mounted)\nconst { SecretManagerServiceClient } = require('@google-cloud/secret-manager');\nconst client = new SecretManagerServiceClient();\n\nasync function getSecret(name) {\n  const [version] = await client.accessSecretVersion({\n    name: `projects/${projectId}/secrets/${name}/versions/latest`\n  });\n  return version.payload.data.toString();\n}\n```\n\n## Sharp Edges\n\n### /tmp Filesystem Counts Against Memory\n\nSeverity: HIGH\n\nSituation: Writing files to /tmp directory in Cloud Run\n\nSymptoms:\nContainer killed with OOM error.\nMemory usage spikes unexpectedly.\nFile operations cause container restarts.\n\"Container memory limit exceeded\" in logs.\n\nWhy this breaks:\nCloud Run uses an in-memory filesystem for /tmp. Any files written\nto /tmp consume memory from your container's allocation.\n\nCommon scenarios:\n- Downloading files temporarily\n- Creating temp processing files\n- Libraries caching to /tmp\n- Large log buffers\n\nA 512MB container that downloads a 200MB file to /tmp only has\n~300MB left for the application.\n\nRecommended fix:\n\n## Calculate memory including /tmp usage\n\n```yaml\n# cloudbuild.yaml\nsteps:\n  - name: 'gcr.io/cloud-builders/gcloud'\n    args:\n      - 'run'\n      - 'deploy'\n      - 'my-service'\n      - '--memory=1Gi'  # Include /tmp overhead\n      - '--image=gcr.io/$PROJECT_ID/my-service'\n```\n\n## Stream instead of buffering\n\n```python\n# BAD - buffers entire file in /tmp\ndef process_large_file(bucket_name, blob_name):\n    blob = bucket.blob(blob_name)\n    blob.download_to_filename('/tmp/large_file')\n    with open('/tmp/large_file', 'rb') as f:\n        process(f.read())\n\n# GOOD - stream processing\ndef process_large_file(bucket_name, blob_name):\n    blob = bucket.blob(blob_name)\n    with blob.open('rb') as f:\n        for chunk in iter(lambda: f.read(8192), b''):\n            process_chunk(chunk)\n```\n\n## Use Cloud Storage for large files\n\n```python\nfrom google.cloud import storage\n\ndef process_with_gcs(bucket_name, input_blob, output_blob):\n    client = storage.Client()\n    bucket = client.bucket(bucket_name)\n\n    # Process directly to/from GCS\n    input_blob = bucket.blob(input_blob)\n    output_blob = bucket.blob(output_blob)\n\n    with input_blob.open('rb') as reader:\n        with output_blob.open('wb') as writer:\n            for chunk in iter(lambda: reader.read(65536), b''):\n                processed = transform(chunk)\n                writer.write(processed)\n```\n\n## Monitor memory usage\n\n```python\nimport psutil\nimport logging\n\ndef log_memory():\n    memory = psutil.virtual_memory()\n    logging.info(f\"Memory: {memory.percent}% used, \"\n                f\"{memory.available / 1024 / 1024:.0f}MB available\")\n```\n\n### Concurrency=1 Causes Scaling Bottlenecks\n\nSeverity: HIGH\n\nSituation: Setting concurrency to 1 for request isolation\n\nSymptoms:\nAuto-scaling creates many container instances.\nHigh latency during traffic spikes.\nIncreased cold starts.\nHigher costs from more instances.\n\nWhy this breaks:\nSetting concurrency to 1 means each container handles only one\nrequest at a time. During traffic spikes:\n\n- 100 concurrent requests = 100 container instances\n- Each instance has cold start overhead\n- More instances = higher costs\n- Scaling takes time, requests queue up\n\nThis should only be used when:\n- Processing is truly single-threaded\n- Memory-heavy per-request processing\n- Using thread-unsafe libraries\n\nRecommended fix:\n\n## Set appropriate concurrency\n\n```bash\n# For I/O-bound workloads (most web apps)\ngcloud run deploy my-service \\\n  --concurrency=80 \\\n  --max-instances=100\n\n# For CPU-bound workloads\ngcloud run deploy my-service \\\n  --concurrency=4 \\\n  --cpu=2\n\n# Only use 1 when absolutely necessary\ngcloud run deploy my-service \\\n  --concurrency=1 \\\n  --max-instances=1000  # Be prepared for many instances\n```\n\n## Node.js - use async properly\n\n```javascript\n// With high concurrency, ensure async operations\nconst express = require('express');\nconst app = express();\n\napp.get('/api/data', async (req, res) => {\n  // All I/O should be async\n  const data = await fetchFromDatabase();\n  const enriched = await enrichData(data);\n  res.json(enriched);\n});\n\n// Concurrency 80+ is safe for async I/O workloads\n```\n\n## Python - use async framework\n\n```python\nfrom fastapi import FastAPI\nimport asyncio\nimport httpx\n\napp = FastAPI()\n\n@app.get(\"/api/data\")\nasync def get_data():\n    # Async I/O allows high concurrency\n    async with httpx.AsyncClient() as client:\n        response = await client.get(\"https://api.example.com/data\")\n        return response.json()\n\n# Concurrency 80+ safe with async framework\n```\n\n## Calculate concurrency\n\n```\nconcurrency = memory_limit / per_request_memory\n\nExample:\n- 512MB container\n- 20MB per request overhead\n- Safe concurrency: ~25\n```\n\n### CPU Throttled When Not Handling Requests\n\nSeverity: HIGH\n\nSituation: Running background tasks or processing between requests\n\nSymptoms:\nBackground tasks run extremely slowly.\nScheduled work doesn't complete.\nMetrics collection fails.\nConnection keep-alive breaks.\n\nWhy this breaks:\nBy default, Cloud Run throttles CPU to near-zero when not actively\nhandling a request. This is \"CPU only during requests\" mode.\n\nAffected operations:\n- Background threads\n- Connection pool maintenance\n- Metrics/telemetry emission\n- Scheduled tasks within container\n- Cleanup operations after response\n\nRecommended fix:\n\n## Enable CPU always allocated\n\n```bash\n# CPU allocated even outside requests\ngcloud run deploy my-service \\\n  --cpu-throttling=false \\\n  --min-instances=1\n\n# Note: This increases costs but enables background work\n```\n\n## Use startup CPU boost for initialization\n\n```bash\n# Boost CPU during cold start only\ngcloud run deploy my-service \\\n  --cpu-boost \\\n  --cpu-throttling=true  # Default, throttle after request\n```\n\n## Move background work to Cloud Tasks\n\n```python\nfrom google.cloud import tasks_v2\nimport json\n\ndef create_background_task(payload):\n    client = tasks_v2.CloudTasksClient()\n    parent = client.queue_path(\n        \"my-project\", \"us-central1\", \"my-queue\"\n    )\n\n    task = {\n        \"http_request\": {\n            \"http_method\": tasks_v2.HttpMethod.POST,\n            \"url\": \"https://my-service.run.app/process\",\n            \"body\": json.dumps(payload).encode(),\n            \"headers\": {\"Content-Type\": \"application/json\"}\n        }\n    }\n\n    client.create_task(parent=parent, task=task)\n\n# Handle response immediately, background via Cloud Tasks\n@app.post(\"/api/order\")\nasync def create_order(order: Order):\n    order_id = await save_order(order)\n\n    # Queue background processing\n    create_background_task({\"order_id\": order_id})\n\n    return {\"order_id\": order_id, \"status\": \"processing\"}\n```\n\n## Use Pub/Sub for async processing\n\n```yaml\n# Move heavy processing to separate service\nsteps:\n  # Main service - responds quickly\n  - name: 'gcr.io/cloud-builders/gcloud'\n    args: ['run', 'deploy', 'api-service',\n           '--cpu-throttling=true']\n\n  # Worker service - processes messages\n  - name: 'gcr.io/cloud-builders/gcloud'\n    args: ['run', 'deploy', 'worker-service',\n           '--cpu-throttling=false',\n           '--min-instances=1']\n```\n\n### VPC Connector 10-Minute Idle Timeout\n\nSeverity: MEDIUM\n\nSituation: Cloud Run service connecting to VPC resources\n\nSymptoms:\nConnection errors after period of inactivity.\n\"Connection reset\" or \"Connection refused\" errors.\nSporadic failures to VPC resources.\nDatabase connections drop unexpectedly.\n\nWhy this breaks:\nCloud Run's VPC connector has a 10-minute idle timeout on connections.\nIf a connection is idle for 10 minutes, it's silently closed.\n\nAffects:\n- Database connection pools\n- Redis connections\n- Internal API connections\n- Any persistent VPC connection\n\nRecommended fix:\n\n## Configure connection pool with keep-alive\n\n```python\n# SQLAlchemy with connection recycling\nfrom sqlalchemy import create_engine\n\nengine = create_engine(\n    DATABASE_URL,\n    pool_size=5,\n    max_overflow=2,\n    pool_recycle=300,  # Recycle connections every 5 minutes\n    pool_pre_ping=True  # Validate connection before use\n)\n```\n\n## TCP keep-alive for custom connections\n\n```python\nimport socket\n\nsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\nsock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)\nsock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 60)\nsock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 60)\nsock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, 5)\n```\n\n## Redis with connection validation\n\n```python\nimport redis\n\npool = redis.ConnectionPool(\n    host=REDIS_HOST,\n    port=6379,\n    socket_keepalive=True,\n    socket_keepalive_options={\n        socket.TCP_KEEPIDLE: 60,\n        socket.TCP_KEEPINTVL: 60,\n        socket.TCP_KEEPCNT: 5\n    },\n    health_check_interval=30\n)\nclient = redis.Redis(connection_pool=pool)\n```\n\n## Use Cloud SQL Proxy sidecar\n\n```yaml\n# Use Cloud SQL connector which handles reconnection\n# requirements.txt\ncloud-sql-python-connector[pg8000]\n```\n\n```python\nfrom google.cloud.sql.connector import Connector\nimport sqlalchemy\n\nconnector = Connector()\n\ndef getconn():\n    return connector.connect(\n        \"project:region:instance\",\n        \"pg8000\",\n        user=\"user\",\n        password=\"password\",\n        db=\"database\"\n    )\n\nengine = sqlalchemy.create_engine(\n    \"postgresql+pg8000://\",\n    creator=getconn\n)\n```\n\n### Container Startup Timeout (4 minutes max)\n\nSeverity: HIGH\n\nSituation: Deploying containers with slow initialization\n\nSymptoms:\nDeployment fails with \"Container failed to start\".\nService never becomes healthy.\n\"Revision failed to become ready\" errors.\nWorks locally but fails on Cloud Run.\n\nWhy this breaks:\nCloud Run expects your container to start listening on PORT within\n4 minutes (240 seconds). If it doesn't, the instance is killed.\n\nCommon causes:\n- Heavy framework initialization (ML models, etc.)\n- Waiting for external dependencies at startup\n- Large dependency loading\n- Database migrations on startup\n\nRecommended fix:\n\n## Enable startup CPU boost\n\n```bash\ngcloud run deploy my-service \\\n  --cpu-boost \\\n  --startup-cpu-boost\n```\n\n## Lazy initialization\n\n```python\nfrom functools import lru_cache\nfrom fastapi import FastAPI\n\napp = FastAPI()\n\n# Don't load at import time\nmodel = None\n\n@lru_cache()\ndef get_model():\n    global model\n    if model is None:\n        # Load on first request, not at startup\n        model = load_heavy_model()\n    return model\n\n@app.get(\"/predict\")\nasync def predict(data: dict):\n    model = get_model()  # Loads on first call only\n    return model.predict(data)\n\n# Startup is fast - model loads on first request\n```\n\n## Start listening immediately\n\n```python\nimport asyncio\nfrom fastapi import FastAPI\nimport uvicorn\n\napp = FastAPI()\n\n# Global state for async initialization\ninitialized = asyncio.Event()\n\n@app.on_event(\"startup\")\nasync def startup():\n    # Start background initialization\n    asyncio.create_task(async_init())\n\nasync def async_init():\n    # Heavy initialization happens after server starts\n    await load_models()\n    await warm_up_connections()\n    initialized.set()\n\n@app.get(\"/ready\")\nasync def ready():\n    if not initialized.is_set():\n        raise HTTPException(503, \"Still initializing\")\n    return {\"status\": \"ready\"}\n\n@app.get(\"/health\")\nasync def health():\n    # Always respond - health check passes\n    return {\"status\": \"healthy\"}\n```\n\n## Use multi-stage builds\n\n```dockerfile\n# Build stage - slow\nFROM python:3.11 as builder\nWORKDIR /app\nCOPY requirements.txt .\nRUN pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt\n\n# Runtime stage - fast startup\nFROM python:3.11-slim\nWORKDIR /app\nCOPY --from=builder /wheels /wheels\nRUN pip install --no-cache /wheels/* && rm -rf /wheels\nCOPY . .\nCMD [\"uvicorn\", \"main:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8080\"]\n```\n\n## Run migrations separately\n\n```bash\n# Don't migrate on startup - use Cloud Build\nsteps:\n  # Run migrations first\n  - name: 'gcr.io/cloud-builders/gcloud'\n    entrypoint: 'bash'\n    args:\n      - '-c'\n      - |\n        gcloud run jobs execute migrate-job --wait\n\n  # Then deploy\n  - name: 'gcr.io/cloud-builders/gcloud'\n    args: ['run', 'deploy', 'my-service', ...]\n```\n\n### Second Generation Execution Environment Differences\n\nSeverity: MEDIUM\n\nSituation: Migrating to or using Cloud Run second-gen execution environment\n\nSymptoms:\nNetwork behavior changes.\nDifferent syscall support.\nFile system behavior differences.\nContainer behaves differently than in first-gen.\n\nWhy this breaks:\nCloud Run's second-generation execution environment uses a different\nsandbox (gVisor) with different characteristics:\n\n- More Linux syscalls supported\n- Full /proc and /sys access\n- Different network stack\n- No automatic HTTPS redirect\n- Different tmp filesystem behavior\n\nRecommended fix:\n\n## Explicitly set execution environment\n\n```bash\n# First generation (legacy)\ngcloud run deploy my-service \\\n  --execution-environment=gen1\n\n# Second generation (recommended for most)\ngcloud run deploy my-service \\\n  --execution-environment=gen2\n```\n\n## Handle network differences\n\n```python\n# Second-gen doesn't auto-redirect HTTP to HTTPS\nfrom fastapi import FastAPI, Request\nfrom fastapi.responses import RedirectResponse\n\napp = FastAPI()\n\n@app.middleware(\"http\")\nasync def redirect_https(request: Request, call_next):\n    # Check X-Forwarded-Proto header\n    if request.headers.get(\"X-Forwarded-Proto\") == \"http\":\n        url = request.url.replace(scheme=\"https\")\n        return RedirectResponse(url, status_code=301)\n    return await call_next(request)\n```\n\n## GPU access (second-gen only)\n\n```bash\n# GPUs only available in second-gen\ngcloud run deploy ml-service \\\n  --execution-environment=gen2 \\\n  --gpu=1 \\\n  --gpu-type=nvidia-l4\n```\n\n## Check execution environment\n\n```python\nimport os\n\ndef get_execution_environment():\n    # Second-gen has different /proc structure\n    try:\n        with open('/proc/version', 'r') as f:\n            version = f.read()\n            if 'gVisor' in version:\n                return 'gen2'\n    except:\n        pass\n    return 'gen1'\n```\n\n### Request Timeout Configuration Mismatch\n\nSeverity: MEDIUM\n\nSituation: Long-running requests or background processing\n\nSymptoms:\nRequests terminated before completion.\n504 Gateway Timeout errors.\nProcessing stops unexpectedly.\nInconsistent timeout behavior.\n\nWhy this breaks:\nCloud Run has multiple timeout configurations that must align:\n- Request timeout (default 300s, max 3600s for HTTP, 60m for gRPC)\n- Client timeout\n- Downstream service timeouts\n- Load balancer timeout (for external access)\n\nRecommended fix:\n\n## Set consistent timeouts\n\n```bash\n# Increase request timeout (max 3600s for HTTP)\ngcloud run deploy my-service \\\n  --timeout=900  # 15 minutes\n```\n\n## Handle long-running with webhooks\n\n```python\nfrom fastapi import FastAPI, BackgroundTasks\nimport httpx\n\napp = FastAPI()\n\n@app.post(\"/process\")\nasync def process(data: dict, background_tasks: BackgroundTasks):\n    task_id = create_task_id()\n\n    # Start background processing\n    background_tasks.add_task(\n        long_running_process,\n        task_id,\n        data,\n        data.get(\"callback_url\")\n    )\n\n    # Return immediately\n    return {\"task_id\": task_id, \"status\": \"processing\"}\n\nasync def long_running_process(task_id, data, callback_url):\n    result = await heavy_computation(data)\n\n    # Callback when done\n    if callback_url:\n        async with httpx.AsyncClient() as client:\n            await client.post(callback_url, json={\n                \"task_id\": task_id,\n                \"result\": result\n            })\n```\n\n## Use Cloud Tasks for reliable long-running\n\n```python\nfrom google.cloud import tasks_v2\n\ndef create_long_running_task(data):\n    client = tasks_v2.CloudTasksClient()\n    parent = client.queue_path(PROJECT, REGION, \"long-tasks\")\n\n    task = {\n        \"http_request\": {\n            \"http_method\": tasks_v2.HttpMethod.POST,\n            \"url\": \"https://worker.run.app/process\",\n            \"body\": json.dumps(data).encode(),\n            \"headers\": {\"Content-Type\": \"application/json\"}\n        },\n        \"dispatch_deadline\": {\"seconds\": 1800}  # 30 min\n    }\n\n    return client.create_task(parent=parent, task=task)\n```\n\n## Streaming for long responses\n\n```python\nfrom fastapi import FastAPI\nfrom fastapi.responses import StreamingResponse\n\n@app.get(\"/large-report\")\nasync def large_report():\n    async def generate():\n        for chunk in process_large_data():\n            yield chunk\n\n    return StreamingResponse(generate(), media_type=\"text/plain\")\n```\n\n## Validation Checks\n\n### Hardcoded GCP Credentials\n\nSeverity: ERROR\n\nGCP credentials must never be hardcoded in source code\n\nMessage: Hardcoded GCP service account credentials. Use Secret Manager or Workload Identity.\n\n### GCP API Key in Source Code\n\nSeverity: ERROR\n\nAPI keys should use Secret Manager\n\nMessage: Hardcoded GCP API key. Use Secret Manager.\n\n### Credentials JSON File in Repository\n\nSeverity: ERROR\n\nService account JSON files should not be in source control\n\nMessage: Credentials file detected. Add to .gitignore and use Secret Manager.\n\n### Running as Root User\n\nSeverity: WARNING\n\nContainers should not run as root for security\n\nMessage: Dockerfile runs as root. Add USER directive for security.\n\n### Missing Health Check in Dockerfile\n\nSeverity: INFO\n\nCloud Run uses HTTP health checks, Dockerfile HEALTHCHECK is optional\n\nMessage: No HEALTHCHECK in Dockerfile. Cloud Run uses its own health checks.\n\n### Hardcoded Port in Application\n\nSeverity: WARNING\n\nPort should come from PORT environment variable\n\nMessage: Hardcoded port. Use PORT environment variable for Cloud Run.\n\n### Large File Writes to /tmp\n\nSeverity: WARNING\n\n/tmp uses container memory, large writes can cause OOM\n\nMessage: /tmp writes consume memory. Consider Cloud Storage for large files.\n\n### Synchronous File Operations\n\nSeverity: WARNING\n\nSync file ops block the event loop in async apps\n\nMessage: Synchronous file operations. Use async versions for better concurrency.\n\n### Global Mutable State\n\nSeverity: WARNING\n\nGlobal state issues with concurrent requests\n\nMessage: Global mutable state may cause issues with concurrent requests.\n\n### Thread-Unsafe Singleton Pattern\n\nSeverity: WARNING\n\nSingletons need thread safety for concurrency > 1\n\nMessage: Singleton pattern - ensure thread safety if using concurrency > 1.\n\n## Collaboration\n\n### Delegation Triggers\n\n- user needs AWS serverless -> aws-serverless (Lambda, API Gateway, SAM)\n- user needs Azure containers -> azure-functions (Azure Container Apps, Functions)\n- user needs database design -> postgres-wizard (Cloud SQL design, AlloyDB)\n- user needs authentication -> auth-specialist (Firebase Auth, Identity Platform)\n- user needs AI integration -> llm-architect (Vertex AI, Cloud Run + LLM)\n- user needs workflow orchestration -> workflow-automation (Cloud Workflows, Eventarc)\n\n## When to Use\nUse this skill when the request clearly matches the capabilities and patterns described above.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["gcp","cloud","run","antigravity","awesome","skills","sickn33"],"capabilities":["skill","source-sickn33","category-antigravity-awesome-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/gcp-cloud-run","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under sickn33/antigravity-awesome-skills","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill:v1","enrichmentVersion":1,"enrichedAt":"2026-04-25T09:40:44.878Z","embedding":null,"createdAt":"2026-04-18T20:37:11.135Z","updatedAt":"2026-04-25T09:40:44.878Z","lastSeenAt":"2026-04-25T09:40:44.878Z","tsv":"'-10':1462 '/$project_id/my-service''':1740 '/$project_id/my-service:$commit_sha''':329,359 '/$project_id/my-service:$commit_sha'',':296 '/$project_id/my-service:$commit_sha'']':309 '/.s.pgsql.5432':1440 '/api/analytics':738 '/api/compute':931 '/api/data':913,990,2080,2124 '/api/items':225 '/api/order':2379 '/api/users':1361 '/app':149,163,679,693,952,2990,3015 '/app/node_modules':171,697 '/bigquery':727 '/cloud-builders/docker''':290,304 '/cloud-builders/gcloud''':1725,2429,2447,3059,3077 '/cloudsql':1347,1436 '/data':2144 '/distroless/nodejs20-debian12':691 '/functions-framework':440,462,498 '/google.com/cloudsdktool/cloud-sdk''':317 '/health':215,2963 '/large-report':3581 '/node_modules':172,698 '/predict':2868 '/proc':3146,3307 '/proc/version':3312 '/process':2355,3431,3544 '/pubsub':1084,1104,1178 '/ready':2946 '/secret-manager':1594 '/secrets':1610 '/secrets/api-key':1552,1578 '/src':175,701 '/sys':3148 '/tmp':77,1617,1628,1666,1671,1691,1704,1717,1735,1751,3761,3764,3774 '/tmp/large_file':1767,1770 '/versions/latest':1612 '/wheels':3003,3019,3020,3027,3030 '0':265 '0.0.0.0':3037 '0f':1894 '1':342,346,391,395,624,657,860,873,875,1000,1898,1908,1939,2040,2051,2274,2461,2608,3285,3843,3853 '10':888,2464,2510,2522 '100':350,399,1378,1953,1956,2022 '1000':2055 '10000':1359 '1024':1892,1893 '15':3412 '1800':1452,3557 '1gi':770,1733 '2':643,772,977,1446,2037,2570 '20':144,160,674,1011 '200':219,1146,1150 '200mb':1701 '20mb':2164 '240':2770 '25':2170 '250':1023 '2gi':890 '3':662 '3.11':949,2986,3012 '30':1449,2659,3558 '300':2573 '30000':1357 '300mb':1707 '300s':3372 '301':3254 '3600s':3374,3401 '4':704,965,975,2035,2718,2768 '400':1118 '5':751,1250,1352,1443,1461,2567,2577,2626,2655 '50':782 '500':244,1160,1165 '503':2956 '504':3347 '512mb':1696,2162 '512mi':340,389 '60':2614,2620,2649,2652 '600':1088 '60m':3377 '6379':2640 '65536':1864 '8':73,1010 '80':352,401,839,858,1017,2018,2101,2148 '8080':186,188,269,3039 '8192':1802 '900':3411 'absolut':2042 'access':1558,1567,1580,3149,3261,3390 'accord':80 'account':1497,3623,3661 'ack':1086 'ack-deadlin':1085 'acknowledg':1148 'activ':2221 'add':87,1288,3674,3700 'add-cloudsql-inst':1287 'adjust':74,840 'affect':2232,2528 'ai':3902,3908 'align':3368 'aliv':2204,2549,2590 'alloc':1678,2254,2257 'allow':337,386,539,2131 'allow-unauthent':336,385,538 'alloydb':3889 'alway':2253,2967 'antigrav':4 'api':119,222,619,1492,1533,1584,2434,2535,3632,3639,3648,3865 'api-servic':2433 'api.example.com':2143 'api.example.com/data':2142 'apikey':1564,1576 'app':207,850,979,986,1099,2010,2077,2121,2833,2905,3035,3220,3428,3798,3877 'app.get':214,224,737,912,930,1360,2079,2123,2867,2945,2962,3580 'app.listen':272 'app.middleware':3222 'app.on':2914 'app.post':1103,2378,3430 'app.route':989 'app.use':209,1101 'applic':21,117,615,1270,1711,3737 'application/json':2364,3553 'appropri':1466,2002 'architect':3906 'architectur':42,1050 'arg':291,305,320,1432,1726,2430,2448,3062,3078 'ask':3972 'async':227,501,739,910,914,1105,1183,1362,1599,2063,2070,2081,2088,2105,2110,2125,2129,2134,2151,2380,2412,2869,2910,2917,2925,2927,2929,2947,2964,3224,3432,3468,3489,3582,3586,3797,3804 'async/await':904 'asynchron':1042 'asyncio':2118,2898 'asyncio.create':2923 'asyncio.event':2913 'attack':797 'attempt':1249 'attribut':1202 'auth':3894,3897 'auth-specialist':3893 'authent':3892 'auto':1914,3206 'auto-redirect':3205 'auto-sc':1913 'autom':3918 'automat':3154 'avail':1896,3269 'aw':3859,3862 'await':233,518,747,920,1142,1198,1367,1372,1605,2091,2095,2140,2388,2937,2940,3256,3479,3494 'awesom':5 'aws-serverless':3861 'azur':3870,3873,3875 'azure-funct':3872 'b':1803,1865 'background':2181,2188,2234,2281,2314,2329,2374,2393,2396,2921,3340,3437,3446 'background_tasks.add':3448 'backgroundtask':3425,3439 'bad':927,1746 'balanc':3386 'base':68,841 'base64':478,1136 'bash':522,629,647,756,835,1056,1217,1275,1502,2004,2255,2289,2807,3043,3061,3167,3266,3396 'becom':2739,2744 'behav':3115 'behavior':3105,3112,3160,3356 'best':1455 'better':3807 'bigqueri':722,730 'bigquerycli':715,720,728,732 'bind':972 'blob':1758,1760,1762,1785,1787,1789,1825,1827,1839,1842,1844,1847 'blob.download':1764 'blob.open':1792 'block':928,937,3792 'bodi':2356,3545 'boost':62,355,404,628,638,781,2286,2290,2304,2806,2816,2820 'bottleneck':1901 'bound':864,1005,2026 'boundari':3980 'break':1656,1935,2205,2208,2502,2756,3124,3359 'bucket':510,590,593,1756,1783,1822,1830,1832 'bucket.blob':1761,1788,1840,1845 'buffer':1694,1744,1747 'buffer.from':476,1134,1193 'build':16,138,283,292,2979,2981,3051 'builder':147,170,677,696,2988,3018 'c':3063 'cach':960,1689,2828,2844,2998,3026 'calcul':1714,2153 'call':2880,3230,3257 'callback':3457,3476,3483,3487,3496 'capabl':3934 'catch':238,1153 'category-antigravity-awesome-skills' 'caus':1645,1899,2781,3771,3825 'central1':333,384,544,566,597,642,661,776,2342 'chang':3106 'characterist':3140 'check':212,2657,2970,3232,3292,3604,3707,3717,3733 'chunk':1797,1805,1806,1859,1868,3590,3596 'ci':155,685 'clarif':3974 'clean':100 'cleanup':2245 'clear':3931,3947 'client':743,1366,1596,1828,2138,2332,2660,3380,3493,3525 'client.accesssecretversion':1606 'client.bucket':1831 'client.create':2365,3561 'client.get':2141 'client.post':3495 'client.query':748,1373 'client.queue':2335,3528 'client.release':1382 'close':263,2527 'cloud':2,11,25,29,46,103,111,178,312,405,414,425,439,461,489,497,568,607,726,816,1037,1054,1068,1177,1251,1256,1259,1278,1340,1474,1487,1593,1631,1657,1808,2211,2317,2376,2471,2503,2666,2672,2680,2752,2757,3050,3096,3125,3360,3506,3712,3727,3755,3779,3886,3909,3919 'cloud-sql-python-connector':2679 'cloudbuild.yaml':281,368,1720 'cloudev':465,502 'cloudevent.data':505 'cloudevent.data.message':471 'cloudevent.type':508,516 'cloudsql':1289 'cmd':197,702,969,3032 'code':1008,3253,3618,3636 'cold':35,57,598,603,784,789,831,1926,1962,2293 'collabor':3854 'collect':2199 'come':3742 'common':1679,2780 'complet':2197,3346 'complex':125,1271 'comput':3481 'concurr':67,351,400,809,813,834,837,857,872,887,892,902,943,968,997,999,1009,1016,1022,1897,1906,1937,1954,2003,2017,2034,2050,2068,2100,2133,2147,2154,2155,2169,3808,3818,3828,3842,3852 'configur':810,1501,2543,3330,3365 'connect':1253,1255,1280,1299,1322,1349,1353,1398,1402,1431,1438,1458,1470,2201,2236,2474,2479,2485,2488,2497,2515,2518,2530,2533,2536,2540,2544,2553,2575,2584,2593,2629,2662,2943 'connectiontimeoutmilli':1358 'connector':83,1342,2463,2507,2674,2683,2689,2692,2693 'connector.connect':2697 'consid':1473,3778 'consist':3394 'console.error':240,1155 'console.log':254,261,274,480,506,509,512,1138,1208 'const':202,206,231,266,270,434,445,456,469,472,492,503,721,742,745,917,934,1094,1098,1127,1130,1172,1179,1187,1191,1196,1323,1327,1365,1370,1563,1571,1575,1588,1595,1603,2072,2076,2089,2093 'consum':1672,3776 'contain':49,89,285,299,664,1634,1646,1648,1676,1697,1918,1942,1957,2163,2244,2715,2725,2733,2761,3114,3687,3766,3871,3876 'container':28,107,131 'content':2362,3551 'content-typ':2361,3550 'control':3669 'copi':150,164,168,173,176,680,694,699,953,964,2991,3016,3031 'cost':1929,1968,2278 'count':1619 'cover':24 'cpu':61,341,354,390,403,627,637,755,760,771,780,859,863,874,1004,2025,2036,2171,2214,2227,2252,2256,2268,2285,2291,2303,2306,2437,2455,2805,2815,2819 'cpu-boost':353,402,636,2302,2814 'cpu-bound':862,1003,2024 'cpu-throttl':2267,2305,2436,2454 'creat':1057,1062,1064,1073,1205,1218,1224,1392,1420,1503,1513,1684,1916,2328,2382,2395,2558,2561,3442,3520 'creator':2713 'credenti':3607,3611,3624,3653,3671 'criteria':3983 'custom':2592 'data':473,483,487,993,1126,1131,1141,1144,1200,1518,2090,2097,2128,2872,2884,3435,3455,3475,3482,3524,3547,3594 'data-fil':1517 'data.get':3456 'databas':1267,1337,1494,2496,2529,2563,2707,2797,3881 'db':1308,1315,1404,1407,1409,1412,1414,1417,1425,1427,1429,2706 'dead':1214,1240 'dead-letter-top':1239 'deadlin':1087,3555 'decod':466,1124 'decoupl':1045 'def':991,1394,1752,1779,1818,1879,2126,2327,2381,2694,2845,2870,2918,2928,2948,2965,3225,3298,3433,3469,3519,3583,3587 'default':836,1018,2210,2309,3371 'defer':803 'deleg':3855 'deliveri':1248 'depend':167,708,2791,2795 'deploy':310,322,370,373,376,523,528,545,550,567,573,632,650,765,853,868,883,1276,1283,1526,1545,1728,2013,2030,2046,2263,2298,2432,2450,2724,2730,2810,3073,3080,3173,3188,3276,3406 'describ':3937,3951 'design':3882,3888 'detect':3673 'develop':1479 'dict':2873,3436 'differ':3088,3107,3113,3116,3135,3139,3150,3157,3198,3306 'dir':961,2999,3002 'direct':371,1835,3702 'directori':1629 'dispatch':3554 'distroless':668,794 'dlq':1219,1227,1231,1245 'dockerfil':133,134,362,666,946,2980,3696,3709,3718,3726 'dockerignor':363 'doesn':2195,2774,3203 'done':3485 'download':1681,1699 'downstream':3382 'driven':34,41,411,1034,1049 'drop':2498 'echo':1505 'edg':1616 'effici':829 'elimin':788 'emiss':2240 'enabl':625,2251,2280,2803 'encod':2359,3548 'endpoint':129,213,1081 'engin':1393,1396,1419,1421,1454,2559,2560,2562,2708,2710 'enrich':2094,2099 'enrichdata':2096 'ensur':2069,3847 'entir':1748 'entrypoint':318,3060 'env':182,184,1296,1306,1313 'environ':1522,1561,3087,3102,3132,3166,3179,3194,3282,3294,3301,3745,3752,3963 'environment-specif':3962 'error':239,241,242,246,249,1154,1158,1471,1638,2480,2490,2746,3350,3609,3638,3659 'etc':2787 'even':2258 'event':33,40,53,410,420,507,582,588,1033,1048,2915,3794 'event-driven':32,39,409,1032,1047 'eventarc':3921 'everi':2576 'exampl':2161 'exceed':1651 'except':3324 'exec':970 'execut':3067,3086,3101,3131,3165,3178,3193,3281,3293,3300 'execution-environ':3177,3192,3280 'exist':1269 'expect':2759 'expert':3968 'explicit':3163 'expos':187 'express':203,205,208,1095,1097,1100,2073,2075,2078 'express.json':210,1102 'extern':2790,3389 'extrem':2191 'f':1422,1435,1773,1795,1886,1890,3315 'f.read':1775,1801,3317 'face':618 'fail':1157,1168,2200,2731,2734,2742,2750 'failur':2492 'fals':2270,2457 'fast':92,2887,3008 'fastapi':2114,2116,2122,2830,2832,2834,2900,2902,2906,3212,3214,3221,3422,3424,3429,3573,3575 'fastapi.responses':3217,3577 'faster':783,799 'fetchfromdatabas':2092 'fetchproduct':923 'fetchus':922 'file':504,513,1519,1541,1570,1626,1643,1668,1682,1687,1702,1749,1755,1782,1812,3110,3655,3663,3672,3758,3783,3785,3790,3801 'file.bucket':511,520 'file.name':514,521 'filenam':1766 'filesystem':78,1618,1664,3159 'filter':583,589 'final':1381 'firebas':3896 'first':807,2856,2879,2891,3055,3120,3168 'first-gen':3119 'fix':1713,2000,2250,2542,2802,3162,3392 'flask':983,985,987 'former':413 'forward':3235,3242 'framework':2111,2152,2783 'fs':1572,1574 'fs.readfilesync':1577 'full':3145 'function':31,50,407,412,415,432,435,455,457,491,493,525,527,547,549,570,572,717,1184,1600,3874,3878 'functions.cloudevent':463,499 'functions.http':441 'functool':2825 'gateway':3348,3866 'gcloud':319,369,372,374,526,548,571,630,648,763,851,866,881,1059,1070,1221,1232,1281,1511,1524,1543,2011,2028,2044,2261,2296,2808,3064,3171,3186,3274,3404 'gcp':1,10,23,3606,3610,3621,3631,3647 'gcr.io':289,295,303,308,316,328,358,690,1724,1739,2428,2446,3058,3076 'gcr.io/$project_id/my-service''':1738 'gcr.io/$project_id/my-service:$commit_sha''':327,357 'gcr.io/$project_id/my-service:$commit_sha'',':294 'gcr.io/$project_id/my-service:$commit_sha'']':307 'gcr.io/cloud-builders/docker''':288,302 'gcr.io/cloud-builders/gcloud''':1723,2427,2445,3057,3075 'gcr.io/distroless/nodejs20-debian12':689 'gcr.io/google.com/cloudsdktool/cloud-sdk''':315 'gcs':1821,1837 'gen':3100,3121,3202,3264,3273,3304 'gen1':3180,3327 'gen2':532,554,577,3195,3283,3323 'generat':3085,3130,3169,3182,3588,3599 'get':992,1395,2127,2846,2875,3299 'getbigquerycli':718,744 'getconn':2695,2714 'getitem':234 'getsecret':1601 'gitignor':3676 'global':2848,2907,3809,3814,3821 'good':909,1019,1776 'googl':438,460,496,725,1176,1592 'google-cloud':437,459,495,724,1175,1591 'google.cloud':1815,2321,3515 'google.cloud.sql.connector':2687 'google.cloud.storage.object.v1.finalized':517,585 'gpu':3260,3284,3287 'gpu-typ':3286 'gpus':3267 'grace':98,250,259,1472 'grpc':3379 'guidelin':998 'gunicorn':945,971 'gvisor':3137,3319 'handl':96,826,900,1090,1469,1943,2175,2222,2371,2676,3196,3414 'handler':54,421,1028 'happen':2933 'hardcod':3605,3615,3620,3646,3734,3748 'header':2360,3237,3549 'health':211,2656,2966,2969,3706,3716,3732 'healthcheck':3719,3724 'healthi':2740,2974 'heavi':707,712,804,1989,2416,2782,2863,2931,3480 'heavycpuoper':936 'hello':451,530 'hello-http':529 'hellohttp':442 'high':621,1207,1623,1903,1920,2067,2132,2178,2722 'high-traff':620 'higher':757,1928,1967 'host':1346,2636,2638,3036 'http':428,431,524,531,537,2347,2349,3208,3223,3244,3376,3403,3536,3538,3715 'httpexcept':2955 'https':3155,3210,3227,3248 'httpx':2120,3427 'httpx.asyncclient':2136,3491 'i/o':901,907,911,2085,2106,2130 'i/o-bound':846,1021,2006 'id':226,2387,2399,2401,2404,2406,3441,3444,3454,3463,3465,3474,3500,3502 'ident':3630,3898 'idl':1467,2466,2512,2520 'idletimeoutmilli':1356 'imag':141,286,300,326,356,665,671,795,1737 'immedi':2373,2895,3460 'impact':778 'import':984,1387,1391,1816,1875,1877,2115,2117,2119,2322,2325,2557,2595,2632,2688,2690,2826,2831,2839,2897,2901,2903,3213,3218,3296,3423,3426,3516,3574,3578 'in-memori':1661 'inact':2484 'includ':76,1716,1734 'inconsist':3354 'increas':752,1925,2277,3397 'index.js':365,433 'inet':2600 'info':3711 'init':802,2926,2930 'initi':706,734,2288,2728,2784,2822,2911,2912,2922,2932,2958 'initialized.is':2952 'initialized.set':2944 'input':1824,1838,1841,3977 'input_blob.open':1849 'instal':957,3023 'instanc':65,345,349,394,398,646,656,787,824,1290,1293,1298,1303,1397,1401,1437,1464,1919,1932,1958,1960,1966,2021,2054,2060,2273,2460,2700,2777 'instead':1742 'integr':1030,1482,3903 'intens':879,1014 'intern':247,2534 'interv':2658 'invalid':1120 'isol':1911 'issu':3816,3826 'item':232,237 'iter':1799,1861 'javascript':200,430,453,488,709,893,1089,1171,1318,1557,2065 'job':3066,3070 'json':152,245,682,2326,3498,3654,3662 'json.dumps':2357,3546 'json.parse':475,1133 'json.stringify':1194 'keep':2203,2548,2589 'keep-al':2202,2547,2588 'keepal':2607,2642,2645 'keepcnt':2625,2654 'keepidl':2613,2648 'keepintvl':2619,2651 'key':1493,1498,1534,1566,3633,3640,3649 'kill':1635,2779 'l4':3291 'lambda':1800,1862,3864 'larg':1692,1754,1781,1811,2794,3584,3593,3757,3768,3782 'latenc':88,605,613,1921 'latency-sensit':612 'latest':1538,1556 'lazi':705,710,801,2821 'left':1708 'legaci':3170 'let':714 'letter':1215,1241 'librari':124,713,1688,1998 'lightweight':1027 'limit':1377,1650,2157,3939 'linux':3142 'listen':276,2764,2894 'llm':3905,3911 'llm-architect':3904 'load':711,805,2796,2837,2854,2862,2877,2889,2938,3385 'local':1478,2748 'log':1653,1693,1878,1880 'logging.info':1885 'long':3336,3416,3450,3470,3511,3521,3533,3569 'long-run':3335,3415,3510 'long-task':3532 'loop':3795 'lru':2827,2843 'main':978,2422,3034 'main.py':981 'mainten':2238 'manag':335,1481,1484,1583,3627,3644,3652,3680 'mani':1917,2059 'match':3932,3948 'max':348,397,1247,1351,1444,1460,2020,2053,2568,2720,3373,3400 'max-delivery-attempt':1246 'max-inst':347,396,2019,2052 'maximum':1024 'may':3824 'mb':1895 'mean':1940 'media':3600 'medium':2469,3090,3333 'memori':75,339,388,753,758,769,878,889,1013,1621,1639,1649,1663,1673,1715,1732,1872,1881,1882,1884,1887,1988,2156,2160,3767,3777 'memory-heavi':1987 'memory-intens':877,1012 'memory.available':1891 'memory.percent':1888 'messag':423,468,470,482,485,553,1043,1093,1122,1125,1128,1170,1210,2443,3619,3645,3670,3695,3722,3747,3773,3799,3820,3844 'message.data':474,477,1132,1135 'messagebuff':1192,1201 'messageid':1197,1211,1213 'method':2350,3539 'metric':2198 'metrics/telemetry':2239 'microservic':1046 'migrat':1268,2798,3041,3046,3054,3069,3092 'migrate-job':3068 'min':64,344,393,655,786,2272,2459,3559 'min-inst':343,392,654,2271,2458 'minim':602,670 'minimum':645 'minut':2465,2511,2523,2578,2719,2769,3413 'mismatch':3331 'miss':3705,3985 'ml':2785,3278 'ml-servic':3277 'mode':2231 'model':2786,2841,2847,2849,2851,2861,2864,2866,2874,2876,2888,2939 'model.predict':2883 'monitor':1871 'mount':1520,1539,1559,1568,1587 'move':2313,2415 'multi':136,2977 'multi-stag':135,2976 'multipl':128,3363 'must':3367,3612 'mutabl':3810,3822 'my-bucket':591 'my-project':2337 'my-queu':2343 'my-secret':1514,1535,1553 'my-secret-valu':1507 'my-servic':323,377,633,651,766,854,869,884,1284,1527,1546,1729,2014,2031,2047,2264,2299,2811,3081,3174,3189,3407 'my-service-xxx.run.app':1083 'my-service-xxx.run.app/pubsub':1082 'my-service.run.app':2354 'my-service.run.app/process':2353 'my-top':560 'mydb':1310 'myuser':1317 'n':1506 'name':287,301,314,446,452,988,1300,1309,1339,1350,1399,1403,1415,1418,1430,1439,1602,1607,1611,1722,1757,1759,1763,1784,1786,1790,1823,1833,2426,2444,3056,3074 'near':2217 'near-zero':2216 'necessari':2043 'need':86,120,736,821,1265,3838,3858,3869,3880,3891,3901,3913 'network':3104,3151,3197 'never':2738,3613 'new':729,1181,1329,1597 'next':3231,3258 'no-cach':3024 'no-cache-dir':958,2996 'node':143,159,196,198,673 'node.js':891,894,2061 'nodejs20':534,556,579 'non':192 'non-root':191 'none':2842,2853 'note':2275 'npm':154,684 'null':716 'nvidia':3290 'nvidia-l4':3289 'ok':221,996,1152 'one':1945 'oom':1637,3772 'op':3791 'open':1769,3311 'oper':908,929,1644,2071,2233,2246,3786,3802 'optim':37,55,600,663,777,823 'option':2646,3721 'orchestr':3915 'order':1063,1075,1078,1140,1186,1190,1195,1204,1226,1237,1244,2383,2384,2385,2386,2390,2391,2398,2400,2403,2405 'orders-dlq':1225,1243 'orders-push':1074,1236 'os':1388,3297 'os.environ':1400,1406,1411,1416 'output':1826,1843,1846,3957 'output_blob.open':1854 'outsid':2259 'overflow':1445,2569 'overhead':1736,1964,2167 'packag':151,681 'package.json':177,367 'parent':2334,2367,2368,3527,3563,3564 'pass':1336,1410,1413,1428,2971,3325 'password':1334,1495,2704,2705 'path':2336,3529 'pattern':102,106,408,601,811,1031,1254,3834,3846,3936 'payload':2331,2358 'per':1463,1991,2158,2165 'per-request':1990 'period':2482 'permiss':3978 'persist':2538 'pg':1326 'pg8000':1424,2684,2701,2712 'ping':2581 'pip':956,2994,3022 'plan':79 'platform':334,3899 'pool':1324,1328,1330,1354,1441,1447,1450,1459,2237,2531,2545,2565,2571,2579,2634,2663,2664 'pool.connect':1368 'port':181,185,267,273,278,279,973,2639,2766,3038,3735,3740,3744,3749,3751 'postgr':3884 'postgres-wizard':3883 'postgresql':1423,2711 'practic':1456 'pre':2580 'predict':2871 'prepar':2057 'principl':45 'prioriti':1206 'process':424,484,552,575,1035,1044,1139,1156,1167,1686,1753,1774,1778,1780,1804,1819,1834,1866,1870,1981,1993,2184,2394,2408,2413,2417,2442,3341,3351,3434,3447,3452,3467,3472,3592 'process-messag':551 'process-upload':574 'process.env.api':1565 'process.env.db':1332,1335,1338 'process.env.instance':1348 'process.env.port':268 'process.exit':264 'process.on':252 'processmessag':486 'processord':1143 'processpubsub':464 'processstorageev':500 'processuploadedfil':519 'product':18,157,166,687,919,926 'production-readi':17 'project':361,1291,1301,1608,2339,2698,3530 'projectid':1609 'promise.all':921 'proper':812,2064 'proto':3236,3243 'proxi':1476,2668 'psutil':1876 'psutil.virtual':1883 'pub/sub':44,422,454,467,546,1029,1038,1091,1113,1121,2410 'publish':1169,1209 'publishord':1185 'pubsub':1060,1071,1173,1180,1182,1222,1233 'pubsub.topic':1189 'pull':800 'push':297,306,1051,1065,1076,1080,1092,1238 'push-endpoint':1079 'python':942,948,980,1383,1384,1745,1813,1874,2108,2112,2319,2550,2594,2631,2682,2685,2823,2896,2985,3011,3199,3295,3420,3513,3571 'queri':1272 'queue':1216,1973,2345,2392 'quick':2425 'r':962,3004,3313 'rais':2954 'rb':1771,1793,1850 'reader':1852 'reader.read':1863 'readi':19,2745,2949,2961 'receiv':256,481 'recommend':1712,1999,2249,2541,2801,3161,3183,3391 'reconnect':2677 'recycl':1451,2554,2572,2574 'redi':2532,2627,2633,2637 'redirect':3156,3207,3226 'redirectrespons':3219,3250 'redis.connectionpool':2635 'redis.redis':2661 'reduc':830 'refus':2489 'region':330,381,541,563,594,639,658,773,1292,1302,2699,3531 'relat':1266 'reliabl':3509 'report':3585 'repositori':3657 'req':216,228,443,740,915,932,1106,1363,2082 'req.body.message':1115,1129 'req.body.name':448 'req.params.id':235 'req.query.name':447 'request':808,939,1110,1910,1946,1955,1972,1992,2159,2166,2176,2186,2224,2230,2260,2312,2348,2857,2892,3215,3228,3229,3259,3328,3338,3343,3369,3398,3537,3819,3829,3930 'request.headers.get':3239 'request.url.replace':3246 'requir':204,436,458,494,723,1096,1174,1325,1573,1590,2074,3976 'requirements.txt':954,963,2678,2992,3005 'res':217,229,444,741,916,933,1107,1364,2083 'res.json':236,749,924,940,1379,2098 'res.send':450 'res.status':218,243,1117,1149,1164 'reset':2486 'resourc':2477,2495 'respond':2424,2968 'respons':2139,2248,2372,3570 'response.json':2146 'restart':1647 'result':746,750,935,941,1371,3478,3503,3504 'result.rows':1380 'retri':1163 'return':731,994,1116,1145,1159,1212,1453,1613,2145,2402,2696,2865,2882,2959,2972,3249,3255,3322,3326,3459,3461,3560,3597 'review':3969 'revis':2741 'rf':3029 'rm':3028 'root':193,3683,3692,3699 'rout':223,366 'run':3,12,26,30,47,104,112,153,179,189,313,321,375,406,608,631,649,683,764,817,852,867,882,955,1055,1069,1257,1282,1488,1525,1544,1632,1658,1727,2012,2029,2045,2180,2190,2212,2262,2297,2431,2449,2472,2504,2753,2758,2809,2993,3021,3040,3053,3065,3079,3097,3126,3172,3187,3275,3337,3361,3405,3417,3451,3471,3512,3522,3681,3690,3697,3713,3728,3756,3910 'runtim':122,533,555,578,3006 'safe':2103,2149,2168 'safeti':3840,3849,3979 'sam':3867 'sandbox':3136 'save':2389 'scale':1900,1915,1969 'scenario':1680 'schedul':2193,2241 'scheme':3247 'scope':3950 'second':2771,3084,3099,3129,3181,3201,3263,3272,3303,3556 'second-gen':3098,3200,3262,3271,3302 'second-gener':3128 'secret':1480,1485,1504,1509,1512,1516,1532,1537,1551,1555,1582,3626,3643,3651,3679 'secretmanagerservicecli':1589,1598 'secur':1261,1483,3694,3704 'select':1374 'send':220,1119,1151,1166 'sensit':614,1500 'separ':2419,3042 'server':248,262,271,275,2935 'server.close':260 'serverless':20,3860,3863 'servic':27,105,109,126,325,379,623,635,653,768,856,871,886,1286,1496,1529,1548,1731,2016,2033,2049,2266,2301,2420,2423,2435,2441,2453,2473,2737,2813,3083,3176,3191,3279,3383,3409,3622,3660 'set':66,644,814,1295,1305,1312,1465,1905,1936,2001,2953,3164,3393 'set-env-var':1294,1304,1311 'sever':1622,1902,2177,2468,2721,3089,3332,3608,3637,3658,3685,3710,3738,3762,3787,3812,3835 'sharp':1615 'shut':257 'shutdown':101,251 'sickn33':9 'sidecar':2669 'signal':97 'sigterm':253,255 'silent':2526 'simpl':52,419 'singl':897,1985 'single-thread':896,1984 'singleton':3833,3837,3845 'situat':1624,1904,2179,2470,2723,3091,3334 'size':1355,1442,2566 'skill':6,7,14,3927,3942 'slim':145,161,675,950,3013 'slow':2727,2983 'slowli':2192 'smaller':140,796 'sock':1434,2597 'sock.setsockopt':2603,2609,2615,2621 'socket':1321,1345,2596,2605,2641,2644 'socket.af':2599 'socket.ipproto':2610,2616,2622 'socket.so':2606 'socket.sock':2601 'socket.socket':2598 'socket.sol':2604 'socket.tcp':2612,2618,2624,2647,2650,2653 'sourc':380,3617,3635,3668 'source-sickn33' 'special':13 'specialist':3895 'specif':3964 'spike':793,828,1641,1924,1952 'sporad':2491 'sql':1252,1260,1279,1341,1475,2667,2673,2681,3887 'sqlalchemi':1386,1390,2551,2556,2691 'sqlalchemy.create':2709 'src':174,364,700 'src/index.js':199,201,703 'stack':3152 'stage':137,2978,2982,3007 'start':36,58,71,91,599,604,785,790,832,1927,1963,2294,2736,2763,2893,2920,2936,3445 'startup':60,626,762,779,2284,2716,2793,2800,2804,2818,2860,2885,2916,2919,3009,3048 'startup-cpu-boost':2817 'state':2908,3811,3815,3823 'stateless':95,130 'status':995,2407,2960,2973,3252,3466 'step':282,1721,2421,3052 'still':2957 'stop':3352,3970 'storag':426,490,569,1809,1817,3780 'storage.client':1829 'stream':1741,1777,2602,3567 'streamingrespons':3579,3598 'structur':360,3308 'subscript':1052,1066,1072,1229,1234 'substitut':3960 'success':3982 'support':3109,3144 'surfac':798 'symptom':1633,1912,2187,2478,2729,3103,3342 'sync':3789 'synchron':3784,3800 'syscal':3108,3143 'system':3111 'take':1970 'task':2182,2189,2242,2318,2323,2330,2346,2366,2369,2370,2377,2397,2924,3438,3440,3443,3449,3453,3462,3464,3473,3499,3501,3507,3517,3523,3534,3535,3562,3565,3566,3946 'tasks_v2.cloudtasksclient':2333,3526 'tasks_v2.httpmethod.post':2351,3540 'tcp':2587,2611,2617,2623 'temp':1685 'temporarili':1683 'termin':3344 'test':3966 'text/plain':3602 'thread':898,976,1986,1996,2235,3831,3839,3848 'thread-unsaf':1995,3830 'throttl':2172,2213,2269,2307,2310,2438,2456 'time':1949,1971,2840 'timeout':1448,1468,2467,2513,2717,3329,3349,3355,3364,3370,3381,3384,3387,3395,3399,3410 'tmp':3158 'to/from':1836 'topic':559,562,1058,1061,1077,1188,1220,1223,1242 'topic.publishmessage':1199 'tostr':479,1137 'traffic':622,792,827,1923,1951 'transact':1274 'transform':1867 'treat':3955 'tri':230,1123,1369,3309 'trigger':427,536,558,581,587,1162,3856 'trigger-event-filt':580,586 'trigger-http':535 'trigger-top':557 'true':2308,2439,2582,2643 'truli':1983 'type':584,1203,2363,3288,3552,3601 'unauthent':338,387,540 'understand':833 'unexpect':1642,2499,3353 'unix':1320,1344,1433 'unsaf':1007,1997,3832 'updat':1228,1235,1531,1550 'update-secret':1530,1549 'upload':576 'url':2352,2564,3245,3251,3458,3477,3488,3497,3541 'us':332,383,543,565,596,641,660,775,2341 'us-central1':331,382,542,564,595,640,659,774,2340 'usag':1640,1718,1873 'use':81,115,180,418,611,667,820,903,1041,1264,1319,1343,1457,1491,1659,1807,1889,1979,1994,2039,2062,2109,2283,2409,2586,2665,2671,2975,3049,3095,3133,3505,3625,3642,3650,3678,3714,3729,3750,3765,3803,3851,3924,3925,3940 'user':194,195,617,918,925,1316,1331,1333,1376,1405,1408,1426,2702,2703,3684,3701,3857,3868,3879,3890,3900,3912 'user-fac':616 'utf8':1579 'util':825 'uvicorn':2904,3033 'v2':2324,3518 'valid':2583,2630,3603,3965 'valu':1510 'var':1297,1307,1314 'variabl':183,1523,1562,3746,3753 'verifi':1108 'version':1604,3316,3321,3805 'version.payload.data.tostring':1614 'vertex':3907 'via':1581,2375 'volum':1542 'vpc':82,2462,2476,2494,2506,2539 'wait':2788,3071 'warm':2941 'warn':3686,3739,3763,3788,3813,3836 'wb':1855 'web':108,116,849,2009 'webhook':429,3419 'wheel':2995,3001 'wheel-dir':3000 'within':2243,2767 'wizard':3885 'work':2194,2282,2315,2747 'workdir':148,162,678,692,951,2989,3014 'worker':966,974,2440,2452 'worker-servic':2451 'worker.run.app':3543 'worker.run.app/process':3542 'workflow':3914,3917,3920 'workflow-autom':3916 'workload':70,132,844,847,865,880,1015,2007,2027,2107,3629 'world':449 'write':1625,3759,3769,3775 'writer':1857 'writer.write':1869 'written':1669 'x':3234,3241 'x-forwarded-proto':3233,3240 'yaml':280,1719,2414,2670 'yield':3595 'zero':2218","prices":[{"id":"cab4e73d-f179-40e3-9bef-b88cea460386","listingId":"5575cecd-6689-4607-a21f-53094518ddf8","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:37:11.135Z"}],"sources":[{"listingId":"5575cecd-6689-4607-a21f-53094518ddf8","source":"github","sourceId":"sickn33/antigravity-awesome-skills/gcp-cloud-run","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/gcp-cloud-run","isPrimary":false,"firstSeenAt":"2026-04-18T21:37:46.819Z","lastSeenAt":"2026-04-25T06:51:11.989Z"},{"listingId":"5575cecd-6689-4607-a21f-53094518ddf8","source":"skills_sh","sourceId":"sickn33/antigravity-awesome-skills/gcp-cloud-run","sourceUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/gcp-cloud-run","isPrimary":true,"firstSeenAt":"2026-04-18T20:37:11.135Z","lastSeenAt":"2026-04-25T09:40:44.878Z"}],"details":{"listingId":"5575cecd-6689-4607-a21f-53094518ddf8","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"gcp-cloud-run","source":"skills_sh","category":"antigravity-awesome-skills","skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/gcp-cloud-run"},"updatedAt":"2026-04-25T09:40:44.878Z"}}