{
  "generated_at": "2026-04-10T10:04:35.596Z",
  "system": {
    "id": "nodo-ecosystem-apps",
    "name": "Nodo Apps",
    "slug": "nodo-ecosystem-apps",
    "kind": "application",
    "summary": "Standalone worker monorepo for smaller Nodo ecosystem APIs such as ClockMe and inspirational quotes.",
    "aliases": [],
    "lifecycle": "active",
    "last_verified": "2026-04-07",
    "owners": [
      "device-platform"
    ],
    "repo_paths": [
      "NodoApplications"
    ],
    "service_ids": [],
    "visibility": "internal",
    "api_contract": {
      "type": "curated",
      "source": "PlatformApplications/TopoloDocs/src/content/internal/apps/nodo-apps.mdx",
      "notes": "Canonical Nodo Apps coverage now lives in the docs application."
    },
    "primary_hosts": [],
    "doc_paths": [
      "internal/apps/nodo-apps"
    ],
    "dependencies": [],
    "public_hub_url": null,
    "internal_hub_url": "/internal/systems/nodo-ecosystem-apps",
    "application_api_url": "/reference/apps/nodo-ecosystem-apps",
    "generated_openapi_url": null,
    "machine_urls": {
      "system": "/machine/systems/nodo-ecosystem-apps.json",
      "application": "/machine/applications/nodo-ecosystem-apps.json"
    }
  },
  "docs": {
    "public": [],
    "internal": [
      {
        "id": "apps/nodo-apps.mdx",
        "title": "Nodo Apps Handbook",
        "summary": "Internal handbook for the standalone Nodo ecosystem worker repo that currently ships ClockMe and inspirational quote APIs.",
        "audience": "internal",
        "tags": [
          "nodo",
          "workers",
          "ecosystem"
        ],
        "url": "/internal/apps/nodo-apps.mdx",
        "last_verified": "2026-04-07"
      }
    ],
    "runbooks": [
      {
        "id": "runbooks/api-key-scope-mismatches.mdx",
        "title": "API Key Scope Mismatches",
        "summary": "Runbook for when TopoloOne or an app shows the wrong API key scopes, no scopes, or unexpected scope drift.",
        "url": "/internal/runbooks/api-key-scope-mismatches.mdx"
      },
      {
        "id": "runbooks/auth-session-and-role-drift.mdx",
        "title": "Auth Session and Role Drift",
        "summary": "Runbook for stale role claims, incorrect admin gating, and mismatches between live org roles and token claims.",
        "url": "/internal/runbooks/auth-session-and-role-drift.mdx"
      },
      {
        "id": "runbooks/cors-and-cross-origin-failures.mdx",
        "title": "CORS and Cross-Origin Failures",
        "summary": "Runbook for preflight failures, wrong API origins, and wildcard-origin credential issues.",
        "url": "/internal/runbooks/cors-and-cross-origin-failures.mdx"
      },
      {
        "id": "runbooks/stale-deploy-and-cache-issues.mdx",
        "title": "Stale Deploy and Cache Issues",
        "summary": "Runbook for old bundles, wrong host delivery, stale service workers, and mismatched Pages/worker routes.",
        "url": "/internal/runbooks/stale-deploy-and-cache-issues.mdx"
      },
      {
        "id": "runbooks/resource-binding-sync-failures.mdx",
        "title": "Resource Binding Sync Failures",
        "summary": "Runbook for missing bindable resources such as brands or workspaces in the API key form.",
        "url": "/internal/runbooks/resource-binding-sync-failures.mdx"
      }
    ]
  },
  "authority": {
    "owners": [
      "device-platform"
    ],
    "repo_paths": [
      "NodoApplications"
    ],
    "service_ids": [],
    "dependencies": [],
    "aliases": []
  },
  "interfaces": {
    "contract_type": "curated",
    "contract_source": "PlatformApplications/TopoloDocs/src/content/internal/apps/nodo-apps.mdx",
    "contract_source_exists": true,
    "openapi": null,
    "readme": null
  },
  "auth": {
    "depends_on_topolo_auth": false,
    "api_key_scopes": [],
    "service_permissions": []
  },
  "runtime": {
    "primary_hosts": [],
    "repo_entries": [
      "NodoApplications/clockme-api/",
      "NodoApplications/nodo-business/",
      "NodoApplications/nodo-concepts/",
      "NodoApplications/nodo-games/",
      "NodoApplications/nodo-horeca/",
      "NodoApplications/nodo-media/",
      "NodoApplications/nodo-sales/",
      "NodoApplications/nodo-utilities/",
      "NodoApplications/topolo.cloudcontrol.json"
    ],
    "wrangler_surfaces": [
      {
        "path": "NodoApplications/clockme-api/wrangler.toml",
        "observabilityEnabled": false,
        "environments": [
          "staging",
          "production"
        ],
        "routes": [],
        "vars": [
          "API_VERSION",
          "ENVIRONMENT"
        ],
        "bindings": [
          {
            "kind": "kv",
            "binding": "CLOCKME_CACHE",
            "sourcePath": "NodoApplications/clockme-api/wrangler.toml",
            "target": "3cde88c7cf374c8fa0cfca4a90b992a7"
          },
          {
            "kind": "d1",
            "binding": "DB",
            "sourcePath": "NodoApplications/clockme-api/wrangler.toml",
            "target": "8d31f746-28fd-47b9-aec7-471292b5856d"
          },
          {
            "kind": "kv",
            "binding": "CLOCKME_CACHE",
            "environment": "staging",
            "sourcePath": "NodoApplications/clockme-api/wrangler.toml",
            "target": "6e8220c4ce274a5d9eee41dfb6a02bad"
          },
          {
            "kind": "d1",
            "binding": "DB",
            "environment": "staging",
            "sourcePath": "NodoApplications/clockme-api/wrangler.toml",
            "target": "f30f5a61-7033-4775-b660-9b7c0a20e3ac"
          },
          {
            "kind": "kv",
            "binding": "CLOCKME_CACHE",
            "environment": "production",
            "sourcePath": "NodoApplications/clockme-api/wrangler.toml",
            "target": "3cde88c7cf374c8fa0cfca4a90b992a7"
          },
          {
            "kind": "d1",
            "binding": "DB",
            "environment": "production",
            "sourcePath": "NodoApplications/clockme-api/wrangler.toml",
            "target": "8d31f746-28fd-47b9-aec7-471292b5856d"
          }
        ],
        "cronTriggers": [],
        "workerName": "clockme-api",
        "main": "src/index.ts",
        "compatibilityDate": "2024-12-20"
      },
      {
        "path": "NodoApplications/nodo-media/inspirational_api/wrangler.toml",
        "observabilityEnabled": false,
        "environments": [],
        "routes": [],
        "vars": [],
        "bindings": [
          {
            "kind": "d1",
            "binding": "DB",
            "sourcePath": "NodoApplications/nodo-media/inspirational_api/wrangler.toml",
            "target": "\"placeholder-id\" # Replace with your actual D1 database ID"
          }
        ],
        "cronTriggers": [],
        "workerName": "inspirational-quotes-api",
        "main": "src/index.js",
        "compatibilityDate": "2023-07-10"
      }
    ],
    "packages": [
      {
        "path": "NodoApplications/clockme-api/package.json",
        "name": "clockme-api",
        "description": "ClockMe API - Time tracking and employee management API built with Cloudflare Workers",
        "scripts": [
          "dev",
          "deploy",
          "deploy:staging",
          "deploy:production",
          "deploy:dry-run",
          "build",
          "type-check",
          "lint",
          "test",
          "db:setup",
          "db:setup:remote",
          "db:setup:staging",
          "db:list",
          "db:console",
          "kv:list"
        ],
        "scriptCommands": [
          {
            "name": "dev",
            "command": "wrangler dev"
          },
          {
            "name": "deploy",
            "command": "wrangler deploy"
          },
          {
            "name": "deploy:staging",
            "command": "wrangler deploy --env staging"
          },
          {
            "name": "deploy:production",
            "command": "wrangler deploy --env production"
          },
          {
            "name": "deploy:dry-run",
            "command": "wrangler deploy --dry-run --config wrangler.toml"
          },
          {
            "name": "build",
            "command": "tsc"
          },
          {
            "name": "type-check",
            "command": "tsc --noEmit"
          },
          {
            "name": "lint",
            "command": "npm run type-check"
          },
          {
            "name": "test",
            "command": "node --test"
          },
          {
            "name": "db:setup",
            "command": "wrangler d1 execute clockme-db --file=schema.sql"
          },
          {
            "name": "db:setup:remote",
            "command": "wrangler d1 execute clockme-db --file=schema.sql --remote"
          },
          {
            "name": "db:setup:staging",
            "command": "wrangler d1 execute DB --file=schema.sql --env staging"
          },
          {
            "name": "db:list",
            "command": "wrangler d1 list"
          },
          {
            "name": "db:console",
            "command": "wrangler d1 execute clockme-db --command=\"SELECT * FROM tenants;\""
          },
          {
            "name": "kv:list",
            "command": "wrangler kv namespace list"
          }
        ]
      },
      {
        "path": "NodoApplications/nodo-media/inspirational_api/package.json",
        "name": "inspirational-quotes-api",
        "description": "Cloudflare Worker API for inspirational quotes",
        "scripts": [
          "dev",
          "deploy",
          "deploy:dry-run",
          "lint",
          "build"
        ],
        "scriptCommands": [
          {
            "name": "dev",
            "command": "wrangler dev"
          },
          {
            "name": "deploy",
            "command": "wrangler deploy"
          },
          {
            "name": "deploy:dry-run",
            "command": "npx --yes wrangler@4 deploy --dry-run --config wrangler.toml"
          },
          {
            "name": "lint",
            "command": "node --check src/index.js"
          },
          {
            "name": "build",
            "command": "node --check src/index.js"
          }
        ]
      }
    ]
  },
  "data": {
    "env_vars": [
      "API_VERSION",
      "ENVIRONMENT"
    ],
    "bindings": [
      {
        "kind": "kv",
        "binding": "CLOCKME_CACHE",
        "sourcePath": "NodoApplications/clockme-api/wrangler.toml",
        "target": "3cde88c7cf374c8fa0cfca4a90b992a7"
      },
      {
        "kind": "d1",
        "binding": "DB",
        "sourcePath": "NodoApplications/clockme-api/wrangler.toml",
        "target": "8d31f746-28fd-47b9-aec7-471292b5856d"
      },
      {
        "kind": "kv",
        "binding": "CLOCKME_CACHE",
        "environment": "staging",
        "sourcePath": "NodoApplications/clockme-api/wrangler.toml",
        "target": "6e8220c4ce274a5d9eee41dfb6a02bad"
      },
      {
        "kind": "d1",
        "binding": "DB",
        "environment": "staging",
        "sourcePath": "NodoApplications/clockme-api/wrangler.toml",
        "target": "f30f5a61-7033-4775-b660-9b7c0a20e3ac"
      },
      {
        "kind": "kv",
        "binding": "CLOCKME_CACHE",
        "environment": "production",
        "sourcePath": "NodoApplications/clockme-api/wrangler.toml",
        "target": "3cde88c7cf374c8fa0cfca4a90b992a7"
      },
      {
        "kind": "d1",
        "binding": "DB",
        "environment": "production",
        "sourcePath": "NodoApplications/clockme-api/wrangler.toml",
        "target": "8d31f746-28fd-47b9-aec7-471292b5856d"
      },
      {
        "kind": "d1",
        "binding": "DB",
        "sourcePath": "NodoApplications/nodo-media/inspirational_api/wrangler.toml",
        "target": "\"placeholder-id\" # Replace with your actual D1 database ID"
      }
    ],
    "queue_bindings": [],
    "storage_kinds": [
      "kv",
      "d1"
    ],
    "workflow_signals": []
  },
  "deployment": {
    "commands": [
      {
        "name": "deploy",
        "command": "NodoApplications/clockme-api/package.json :: wrangler deploy"
      },
      {
        "name": "deploy:staging",
        "command": "NodoApplications/clockme-api/package.json :: wrangler deploy --env staging"
      },
      {
        "name": "deploy:production",
        "command": "NodoApplications/clockme-api/package.json :: wrangler deploy --env production"
      },
      {
        "name": "deploy:dry-run",
        "command": "NodoApplications/clockme-api/package.json :: wrangler deploy --dry-run --config wrangler.toml"
      },
      {
        "name": "build",
        "command": "NodoApplications/clockme-api/package.json :: tsc"
      },
      {
        "name": "deploy",
        "command": "NodoApplications/nodo-media/inspirational_api/package.json :: wrangler deploy"
      },
      {
        "name": "deploy:dry-run",
        "command": "NodoApplications/nodo-media/inspirational_api/package.json :: npx --yes wrangler@4 deploy --dry-run --config wrangler.toml"
      },
      {
        "name": "build",
        "command": "NodoApplications/nodo-media/inspirational_api/package.json :: node --check src/index.js"
      }
    ],
    "routes": [],
    "environments": [
      "staging",
      "production"
    ],
    "assets_directories": [],
    "observability_enabled": false
  },
  "debugging": {
    "failure_modes": [
      "No Auth service ID is registered for this system.",
      "No primary host is registered in the system registry.",
      "Neither OpenAPI nor README-derived interface detail was found."
    ],
    "entrypoints": [
      "NodoApplications/clockme-api/wrangler.toml",
      "NodoApplications/nodo-media/inspirational_api/wrangler.toml",
      "PlatformApplications/TopoloDocs/src/content/internal/apps/nodo-apps.mdx",
      "NodoApplications/clockme-api/package.json",
      "NodoApplications/nodo-media/inspirational_api/package.json"
    ]
  }
}