{
 "features_resolved": {
  "snapshot_any": true,
  "snapshot_mem": false,
  "fork": true,
  "pause_resume": true,
  "persistent_disk": true,
  "whole_disk": null,
  "persist_scope": null,
  "volumes": null,
  "auto_stop_idle": true,
  "long_sessions": null,
  "custom_image": true,
  "image_snapshot": true,
  "image_oci": true,
  "vm_isolation": null,
  "docker_inside": null,
  "nested_virt": null,
  "root": null,
  "systemd": null,
  "browser": true,
  "desktop": null,
  "computer_use": null,
  "code_interpreter": true,
  "browser_control": null,
  "desktop_control": null,
  "browser_and_desktop": null,
  "anti_bot": null,
  "captcha_solving": null,
  "residential_ip": null,
  "agent_harnesses": true,
  "ssh": true,
  "public_ipv4": null,
  "inbound_https": true,
  "custom_domain": null,
  "raw_tcp_inbound": null,
  "egress_allowlist": true,
  "open_internet": true,
  "static_egress_ip": null,
  "private_network": null,
  "self_host": null,
  "byoc": null,
  "open_source": null,
  "soc2": null,
  "hipaa": null,
  "sso": null,
  "gpu": true,
  "arm64": null,
  "windows": null,
  "macos": null,
  "lang_python": true,
  "lang_node": true,
  "lang_go": null,
  "lang_rust": null,
  "lang_java": null,
  "gpu_desktop": null,
  "credential_injection": true,
  "egress_http_rules": null,
  "wake_on_request": null,
  "live_resize": null,
  "fork_running": null,
  "memory_snapshot_fork": null,
  "webhooks": null,
  "scheduled_wakeups": null,
  "audit_logs": null,
  "eu_data_residency": null,
  "zero_data_retention": null,
  "scoped_api_keys": true,
  "spend_limits": true,
  "mcp_server": true,
  "usage_api": null,
  "snapshot_auto": null,
  "snapshot_on_demand": true,
  "harness_api": true,
  "own_agent_api": null,
  "fast_boot": null,
  "strong_isolation": null,
  "ingress_rules": null,
  "guest_firewall": null,
  "secret_proxy": null,
  "secret_proxy_any": null,
  "volume_attach": null,
  "volume_shared": null,
  "sidecar": null,
  "fuse": null,
  "kernel_features": null,
  "burst": null
 },
 "id": "tangle",
 "name": "Tangle Sandbox",
 "url": "https://sandbox.tangle.tools/pricing",
 "category": "agent-sandbox",
 "isolation": null,
 "modes": [
  {
   "key": "general",
   "label": "Pay as you go, general pool (per-second, allocated vCPU + memory + disk)",
   "pricing": "resource",
   "vcpu_h": 0.010445613415710504,
   "ram_gib_h": 0.007050789055604591,
   "cpu_basis": "alloc",
   "ram_basis": "alloc",
   "active_floor": 0,
   "min_charge_hour_usd": 0.04,
   "ram_per_vcpu": [
    null,
    null
   ],
   "ram_fixed_per_vcpu": null,
   "vcpu_options": null,
   "min_vcpu": null,
   "max_vcpu": null,
   "max_ram_gib": null,
   "sizes": null,
   "pool_tiers": null,
   "requires_always_on": false,
   "always_on_month_per_instance": null,
   "commit_note": null,
   "min_billed_seconds": null,
   "granularity_s": 1,
   "start_fee": null,
   "boot_overhead_s": 0,
   "multiplier": 1,
   "windows_vcpu_h": null,
   "gpu": null,
   "os": [
    "linux"
   ],
   "note": "Rates from the public, unauthenticated https://sandbox.tangle.tools/v1/pricing/sandboxes (pool 'general', self-reported source 'reference-constants'): $0.010446/vCPU-h, $0.007051/GB-h memory, $0.0007345/GB-h disk, hourly floor $0.04/h per sandbox. Billing rule from https://sandbox.tangle.tools/llms.txt: \"A running sandbox accrues per second from the owner's prepaid credit at an hourly rate of vCPU x cpuCoreHourUsd + memory GB x memoryGBHourUsd + disk GB x diskGBHourUsd, never below minChargeHourUsd.\" Basis is the sandbox's vCPU / memory / disk (its granted size), so cpu/ram basis = alloc. Memory is priced per GB; the card treats GB as GiB (Tangle sizes memory in memoryMB). min_charge_hour_usd models the $0.04/h minimum across allocated CPU, memory, and running disk; it binds below $0.04/h shapes (1 vCPU / 1 GB / 10 GB = $0.0248/h is billed $0.04/h). Minimum billed seconds and any per-start fee are not published (null). Max vCPU / RAM / disk per sandbox not published (client.shapes() returns them to signed-in accounts only). Rates are shown on https://sandbox.tangle.tools/pricing only to signed-in users; signed-out visitors see plans but no compute rates.",
   "features": {},
   "flags": [],
   "cpu_class": null
  }
 ],
 "storage": {
  "included_disk_gib": 0,
  "disk_gib_month": 0.5361537511032656,
  "disk_billed_when_stopped": null,
  "snapshot_gib_month": null,
  "paused_ram_billed": null,
  "note": "disk_gib_month = diskGBHourUsd $0.0007344571932921447 x 730 h: Tangle bills the sandbox's disk GB per running hour (\"disk GB x diskGBHourUsd\"), which the engine prices as extra disk x running hours / 730 x disk_gib_month. Whether a stopped sandbox's retained workspace is billed, and snapshot storage prices, are not published."
 },
 "network": {
  "egress_free_gib": null,
  "egress_gib": 0.053687,
  "ipv4_month": null,
  "ipv4_available": null,
  "internet": {
   "evidence": [
    {
     "quote": "Unrestricted internet access.",
     "url": "https://docs.tangle.tools/sandbox/sdk/networking",
     "row": "open"
    },
    {
     "quote": "Listed domains and the sandbox’s provisioned model endpoints.",
     "url": "https://docs.tangle.tools/sandbox/sdk/networking",
     "row": "strict"
    },
    {
     "quote": "No outbound internet access.",
     "url": "https://docs.tangle.tools/sandbox/sdk/networking",
     "row": "blocked"
    }
   ],
   "note": "Three outbound modes are documented; which mode a sandbox gets when egressPolicy is omitted is not published, so 'default' is left unset."
  },
  "note": "Egress: Pro $0.05/GB and Team $0.04/GB beyond 2 TB per sandbox per month; Free 100 GiB per account, refused beyond it, never charged. Inbound free. egress_gib = $0.05/GB (Pro) converted to $/GiB; the engine has one account-wide egress rate, so Team's $0.04/GB is a caveat. Per-sandbox allowances are modelled as one sandbox's 2 TB (1862.6 GiB) per plan, a lower bound."
 },
 "plans": [
  {
   "name": "Pay as you go",
   "fee": 0,
   "fee_is_credit": false,
   "included_usd": 0,
   "per_seat": 0,
   "concurrency": 1,
   "max_session_h": null,
   "max_vcpu": null,
   "max_ram_gib": null,
   "sizes_allowed": null,
   "egress_free_gib": 100,
   "egress_cap_gib": 100,
   "note": "Plan id 'free', named 'Free' in the plans API and rendered as 'Pay as you go' / '$0 / month' / 'Pay for usage' on the pricing page (planDisplayName renames a $0, no-credit plan). Features: '1 concurrent sandbox', '3 snapshots per sandbox', '100 GiB egress per account each month, refused beyond it, never charged'. No free credit: usage is paid from prepaid credit ('Sandbox has no free tier or free credit.').",
   "flags": []
  },
  {
   "name": "Pro",
   "fee": 29.99,
   "fee_is_credit": false,
   "included_usd": 29.99,
   "per_seat": 0,
   "concurrency": null,
   "max_session_h": null,
   "max_vcpu": null,
   "max_ram_gib": null,
   "sizes_allowed": null,
   "egress_free_gib": 1862.6,
   "note": "$29.99/month with a $29.99 monthly credit (pricing page renders creditsPerMonth 2999 cents as '$29.99 monthly credit'). Features: 'Unlimited sandboxes', '10 snapshots per sandbox', '2 TB egress per sandbox each month, then $0.05/GB'. Concurrency published as unlimited: the plans JSON has limits.concurrent -1 (Free's same field is 1, matching its '1 concurrent sandbox'). Left null because the engine has no unlimited value and a number would be invented; the engine then assumes Free's 1 (see caveats, .work/engine-needs/tangle.md). Whether unused credit rolls over is not published.",
   "flags": []
  },
  {
   "name": "Team",
   "fee": 99,
   "fee_is_credit": false,
   "included_usd": 99,
   "per_seat": 0,
   "concurrency": null,
   "max_session_h": null,
   "max_vcpu": null,
   "max_ram_gib": null,
   "sizes_allowed": null,
   "egress_free_gib": 1862.6,
   "note": "Plan id 'enterprise', name 'Team': $99/month with a $99 monthly credit. Features: 'Unlimited sandboxes', '25 snapshots per sandbox', '2 TB egress per sandbox each month, then $0.04/GB' (engine prices egress at Pro's $0.05/GB). Concurrency published as unlimited (limits.concurrent -1), null for the same reason as Pro. Seat pricing not published; the dashboard docs describe team roles but no per-seat fee.",
   "flags": []
  }
 ],
 "free": {
  "monthly_credit": 0,
  "one_time_credit": 0
 },
 "features": {
  "linux": true,
  "windows": null,
  "macos": null,
  "arm64": null,
  "gpu": true,
  "gpu_types": [],
  "snapshot": "fs",
  "pause_resume": true,
  "fork": true,
  "persistent_disk": true,
  "volumes": null,
  "auto_stop_idle": true,
  "custom_image": true,
  "docker_inside": null,
  "nested_virt": null,
  "root": null,
  "systemd": null,
  "browser": true,
  "desktop": null,
  "computer_use": null,
  "code_interpreter": true,
  "agent_harnesses": true,
  "ssh": true,
  "public_ipv4": null,
  "inbound_https": true,
  "custom_domain": null,
  "raw_tcp_inbound": null,
  "egress_allowlist": true,
  "static_egress_ip": null,
  "private_network": null,
  "self_host": null,
  "byoc": null,
  "open_source": null,
  "regions": null,
  "soc2": null,
  "hipaa": null,
  "sso": null,
  "lang_python": true,
  "lang_node": true,
  "lang_go": null,
  "lang_rust": null,
  "lang_java": null,
  "gpu_desktop": null,
  "credential_injection": true,
  "egress_http_rules": null,
  "wake_on_request": null,
  "live_resize": null,
  "fork_running": null,
  "memory_snapshot_fork": null,
  "webhooks": null,
  "scheduled_wakeups": null,
  "audit_logs": null,
  "eu_data_residency": null,
  "zero_data_retention": null,
  "scoped_api_keys": true,
  "spend_limits": true,
  "mcp_server": true,
  "browser_control": null,
  "desktop_control": null,
  "anti_bot": null,
  "captcha_solving": null,
  "egress_ip_type": null,
  "isolation": null,
  "image_oci": true,
  "snapshot_auto": null,
  "snapshot_on_demand": true,
  "harness_api": true,
  "egress_allowlist_level": "domain",
  "ingress_rules": null,
  "guest_firewall": null,
  "secret_proxy": null,
  "volume_attach": null,
  "volume_shared": null,
  "own_agent_api": null,
  "fast_boot": null,
  "open_internet": true,
  "usage_api": null
 },
 "perf": {
  "cpu_runs_s": null,
  "cold_start_ms": null,
  "burst_tti_ms": null,
  "dax_s": null
 },
 "perf_source": null,
 "knobs": [],
 "caveats": [
  "Compute rates come from the unauthenticated JSON endpoint https://sandbox.tangle.tools/v1/pricing/sandboxes, linked as 'Machine-readable prices: no key needed' from https://sandbox.tangle.tools/llms.txt and https://sandbox.tangle.tools/.well-known/tangle-agent.json. The human pricing page https://sandbox.tangle.tools/pricing renders plans to everyone but compute rates only to signed-in users. The endpoint labels its numbers source 'reference-constants'; whether a signed-in account (or a paid plan) sees different rates is not published.",
  "Billing rule (per second, allocated vCPU + memory GB + disk GB, hourly floor $0.04) is published in https://sandbox.tangle.tools/llms.txt, https://sandbox.tangle.tools/agent-setup.md and https://sandbox.tangle.tools/.well-known/tangle-agent.json, not on a docs page or the pricing page.",
  "The hourly minimum minChargeHourUsd $0.04/h per running sandbox is modelled by min_charge_hour_usd across allocated CPU, memory, and running disk, prorated per second.",
  "Memory and disk are priced per GB; the card uses them as per GiB (about 7% difference if Tangle means decimal GB).",
  "Max vCPU / memory / disk per sandbox, regions, and isolation technology are not published. Docs say a sandbox 'may run through a managed container, a microVM, or an operator-backed driver' without saying which hosted sandboxes get, so isolation is null.",
  "Pro and Team have unlimited concurrent sandboxes: they list 'Unlimited sandboxes' and the plans JSON has limits.concurrent -1 (Free: 1, its '1 concurrent sandbox'). The engine has no unlimited value, so concurrency is null and the engine assumes Free's 1 concurrent for them; Pro and Team are wrongly shown as capped at 1 until the engine can read an unlimited plan cap.",
  "Free plan ('Pay as you go' on the page) has no free credit: agent-setup.md says 'Sandbox has no free tier or free credit.' Usage needs prepaid credit.",
  "Egress per sandbox (2 TB) is modelled as a single 2 TB account allowance, a lower bound. Team's overage is $0.04/GB; the engine uses Pro's $0.05/GB for all plans.",
  "Stopped-sandbox storage, snapshot storage, minimum billed seconds and start fees are not published (null). Idle timeout exists (idleTimeoutSeconds) but its default for an ordinary create is not published.",
  "GPU leases exist (third-party GPU clouds, per-second billing, spend cap) but no per-GPU price is published; GPU workloads are not priceable.",
  "Tangle's own docs (agents/fleet, measured 2026-09-26) say: 'On that day Claude Code, Hermes, Pi, Kimi Code and OpenClaw failed on production before their first model call, and Codex needed apiKeyEnv.'",
  "Perf fields are empty pending measured runs."
 ],
 "sources": [
  "https://sandbox.tangle.tools/pricing",
  "https://id.tangle.tools/api/v1/plans",
  "https://sandbox.tangle.tools/v1/pricing/sandboxes",
  "https://sandbox.tangle.tools/v1/pricing/egress",
  "https://sandbox.tangle.tools/llms.txt",
  "https://sandbox.tangle.tools/.well-known/tangle-agent.json",
  "https://sandbox.tangle.tools/agent-setup.md",
  "https://sandbox.tangle.tools/docs",
  "https://sandbox.tangle.tools/docs/quickstart",
  "https://sandbox.tangle.tools/docs/sdk/typescript",
  "https://sandbox.tangle.tools/docs/cli",
  "https://sandbox.tangle.tools/docs/web-app",
  "https://sandbox.tangle.tools/docs/gpu-leases",
  "https://sandbox.tangle.tools/docs/comparison",
  "https://sandbox.tangle.tools/docs/agents/multiple",
  "https://sandbox.tangle.tools/docs/agents/fleet",
  "https://sandbox.tangle.tools/docs/agents/mcp",
  "https://sandbox.tangle.tools/docs/templates",
  "https://docs.tangle.tools/sandbox",
  "https://docs.tangle.tools/sandbox/sdk/lifecycle",
  "https://docs.tangle.tools/sandbox/sdk/images-storage",
  "https://docs.tangle.tools/sandbox/sdk/networking",
  "https://docs.tangle.tools/sandbox/sdk/previews-snapshots",
  "https://docs.tangle.tools/sandbox/sdk/interactive",
  "https://docs.tangle.tools/sandbox/sdk/access",
  "https://docs.tangle.tools/sandbox/sdk/instances",
  "https://docs.tangle.tools/sandbox/sdk/agents-sessions",
  "https://docs.tangle.tools/sandbox/sdk/reference",
  "https://docs.tangle.tools/sandbox/sdk/gpu"
 ],
 "fleet": {
  "default_max_instances": 1,
  "default_max_vcpu": null,
  "default_max_gpus": null,
  "raise": "self-serve",
  "raise_time_days": 0,
  "verification": "Prepaid credit is required before the first sandbox (agent-setup.md: HTTP 403 paid_access_required).",
  "tiers": "Pay as you go (Free) 1 concurrent sandbox; Pro $29.99/month and Team $99/month 'Unlimited sandboxes' (plans JSON limits.concurrent -1, unlimited).",
  "notes": "Docs list per-fleet safety limits (8 sandbox creates in flight, maxConcurrentCreates) for the Fleet SDK; account-level create-rate limits are not published.",
  "sources": [
   "https://sandbox.tangle.tools/pricing",
   "https://id.tangle.tools/api/v1/plans",
   "https://sandbox.tangle.tools/docs/agents/fleet",
   "https://sandbox.tangle.tools/agent-setup.md"
  ],
  "researched": "2026-10-11"
 },
 "locations": [],
 "locations_source": null,
 "locations_quote": null,
 "locations_checked": "2026-10-11",
 "feature_evidence": {
  "pricing_basis": {
   "value": "per-second, allocated",
   "source": "https://sandbox.tangle.tools/llms.txt",
   "quote": "A running sandbox accrues per second from the owner's prepaid credit at an hourly rate of vCPU x cpuCoreHourUsd + memory GB x memoryGBHourUsd + disk GB x diskGBHourUsd, never below minChargeHourUsd.",
   "note": "Same sentence in agent-setup.md and the agent manifest's pricing.summary.",
   "checked": "2026-10-11"
  },
  "compute_rates": {
   "value": {
    "cpuCoreHourUsd": 0.010445613415710504,
    "memoryGBHourUsd": 0.007050789055604591,
    "diskGBHourUsd": 0.0007344571932921447,
    "minChargeHourUsd": 0.04,
    "source": "reference-constants"
   },
   "source": "https://sandbox.tangle.tools/v1/pricing/sandboxes",
   "quote": "{\"pools\":{\"general\":{\"cpuCoreHourUsd\":0.010445613415710504,\"memoryGBHourUsd\":0.007050789055604591,\"diskGBHourUsd\":0.0007344571932921447,\"minChargeHourUsd\":0.04,\"source\":\"reference-constants\"}}}",
   "note": "Public, unauthenticated JSON. The pricing page shows these rates only to signed-in users.",
   "checked": "2026-10-11"
  },
  "plans": {
   "value": "Free $0 / Pro $29.99 / Team $99",
   "source": "https://sandbox.tangle.tools/pricing",
   "quote": "\"id\":\"free\",\"name\":\"Free\" ... \"monthlyPriceCents\":0 ... \"features\":[\"1 concurrent sandbox\",\"3 snapshots per sandbox\",\"100 GiB egress per account each month, refused beyond it, never charged\"],\"creditsPerMonth\":0 ... \"id\":\"pro\",\"name\":\"Pro\" ... \"monthlyPriceCents\":2999 ... \"features\":[\"Unlimited sandboxes\",\"10 snapshots per sandbox\",\"2 TB egress per sandbox each month, then $0.05/GB\"],\"creditsPerMonth\":2999 ... \"id\":\"enterprise\",\"name\":\"Team\" ... \"monthlyPriceCents\":9900 ... \"features\":[\"Unlimited sandboxes\",\"25 snapshots per sandbox\",\"2 TB egress per sandbox each month, then $0.04/GB\"],\"creditsPerMonth\":9900",
   "note": "The pricing page fetches https://id.tangle.tools/api/v1/plans and renders name, monthlyPriceCents as '$X / month', creditsPerMonth as '$X monthly credit' (or 'Pay for usage' when 0) and each features string. Quote is fragments of the API response, joined with ' ... '.",
   "checked": "2026-10-11",
   "data_source": "https://id.tangle.tools/api/v1/plans"
  },
  "plan_concurrency": {
   "value": {
    "free": 1,
    "pro": "unlimited",
    "team": "unlimited"
   },
   "source": "https://id.tangle.tools/api/v1/plans",
   "quote": "\"features\":[\"1 concurrent sandbox\" ... \"limits\":{\"rpm\":20,\"dailyTokens\":100000,\"concurrent\":1} ... \"features\":[\"Unlimited sandboxes\" ... \"limits\":{\"rpm\":200,\"dailyTokens\":-1,\"concurrent\":-1} ... \"features\":[\"Unlimited sandboxes\" ... \"limits\":{\"rpm\":-1,\"dailyTokens\":-1,\"concurrent\":-1}",
   "note": "Free, Pro, Team in order; fragments joined with ' ... '. -1 is the unlimited value in this object. Plan concurrency stays null for Pro/Team because the engine has no unlimited value (.work/engine-needs/tangle.md).",
   "checked": "2026-10-14"
  },
  "no_free_credit": {
   "value": true,
   "source": "https://sandbox.tangle.tools/agent-setup.md",
   "quote": "The owner's account has no credit. Sandbox has no free tier or free credit.",
   "note": "Error table row for HTTP 403 paid_access_required.",
   "checked": "2026-10-11"
  },
  "egress": {
   "value": {
    "free": "100 GiB/account, refused",
    "pro": "2 TB/sandbox then $0.05/GB",
    "team": "2 TB/sandbox then $0.04/GB"
   },
   "source": "https://sandbox.tangle.tools/docs/web-app",
   "quote": "Egress is outbound traffic from a sandbox, counted per calendar month (UTC). Inbound traffic is free.",
   "note": "Same terms as JSON at https://sandbox.tangle.tools/v1/pricing/egress: {\"period\":\"calendar-month\",\"metered\":\"outbound\",\"bytesPerGb\":1000000000,\"plans\":{\"free\":{\"scope\":\"account\",\"includedBytes\":107374182400,\"overage\":\"refused\",\"usdPerGb\":0},\"pro\":{\"scope\":\"sandbox\",\"includedBytes\":2000000000000,\"overage\":\"billed\",\"usdPerGb\":0.05},\"enterprise\":{\"scope\":\"sandbox\",\"includedBytes\":2000000000000,\"overage\":\"billed\",\"usdPerGb\":0.04}}}",
   "checked": "2026-10-11"
  },
  "snapshot": {
   "value": "fs",
   "source": "https://sandbox.tangle.tools/docs/sdk/typescript",
   "quote": "A snapshot copies filesystem state. session.fork() copies conversation history.",
   "note": "Filesystem snapshots on demand (box.snapshot(), tangle snapshot create); restore creates a new sandbox, revert rolls back in place. No memory snapshot is documented.",
   "checked": "2026-10-11"
  },
  "snapshot_on_demand": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs/cli",
   "quote": "snapshot restore creates a new sandbox from a snapshot. snapshot revert rolls the existing sandbox back to the snapshot in place.",
   "checked": "2026-10-11"
  },
  "pause_resume": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs/quickstart",
   "quote": "stop() suspends supported Sandboxes while preserving state.",
   "note": "Qualified by 'supported'; docs.tangle.tools/sandbox/sdk/lifecycle adds 'maxLifetimeSeconds limits each running interval on deployments that support suspension.' Whether memory/processes survive is not stated; only state/workspace.",
   "checked": "2026-10-11"
  },
  "persistent_disk": {
   "value": true,
   "source": "https://docs.tangle.tools/sandbox/sdk/lifecycle",
   "quote": "stop() keeps the workspace for later use.",
   "note": "Whether the whole disk or only the workspace survives is not stated (persist_scope unset). Customer-workspace example: '30-day workspace retention after stopping'.",
   "checked": "2026-10-11"
  },
  "fork": {
   "value": true,
   "source": "https://docs.tangle.tools/sandbox/sdk/reference",
   "quote": "Save, restore, and clone workspaces.",
   "note": "Table row for box.snapshot(), .revertToSnapshot(), .restorePaths(), .fork(). Workspace clone. Whether a running sandbox can be forked without pausing is not stated.",
   "checked": "2026-10-11"
  },
  "auto_stop_idle": {
   "value": true,
   "source": "https://docs.tangle.tools/sandbox/sdk/instances",
   "quote": "The example sets a five-minute idle timeout and 30-day workspace retention after stopping.",
   "note": "idleTimeoutSeconds is a create option (TypeScript SDK example uses 900). Default for an ordinary create is not published; the batch API schema defaults idleTimeoutMs to 300000 for persistent batch sandboxes.",
   "checked": "2026-10-11"
  },
  "custom_image": {
   "value": true,
   "source": "https://docs.tangle.tools/sandbox/sdk/lifecycle",
   "quote": "Set it when you need a container image such as python:3.12-slim or an SDK-built image.",
   "note": "Also Image.fromDockerfile() and templates.",
   "checked": "2026-10-11"
  },
  "image_oci": {
   "value": true,
   "source": "https://docs.tangle.tools/sandbox/sdk/images-storage",
   "quote": "Image.fromDockerfile() accepts a Dockerfile instead of the builder above.",
   "note": "Qualified: 'Image builds require a deployment with image-building support.'",
   "checked": "2026-10-11"
  },
  "ssh": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs/cli",
   "quote": "tangle ssh invokes your system ssh through the Sandbox API WebSocket proxy.",
   "note": "Tunnelled through the API (tangle ssh-proxy), not a public SSH port.",
   "checked": "2026-10-11"
  },
  "inbound_https": {
   "value": true,
   "source": "https://docs.tangle.tools/sandbox/sdk/networking",
   "quote": "Preview URLs are public.",
   "note": "box.previewLinks.create(port) creates an HTTPS preview URL. No access rules on previews are documented.",
   "checked": "2026-10-11"
  },
  "egress_allowlist": {
   "value": true,
   "source": "https://docs.tangle.tools/sandbox/sdk/networking",
   "quote": "Tangle applies these policies through its egress proxy.",
   "note": "egressPolicy modes open / strict (allowDomains) / blocked; updatable on a running sandbox. Domain lists only; no IP/CIDR rules documented.",
   "checked": "2026-10-11",
   "level": "domain"
  },
  "open_internet": {
   "value": true,
   "source": "https://docs.tangle.tools/sandbox/sdk/networking",
   "quote": "Unrestricted internet access.",
   "note": "Cell of the egress-mode table row whose mode is 'open'.",
   "checked": "2026-10-11"
  },
  "agent_harnesses": {
   "value": true,
   "source": "https://docs.tangle.tools/sandbox/sdk/agents-sessions",
   "quote": "Choose a supported harness, including Claude Code, Codex, OpenCode, or Pi.",
   "note": "Tangle's own fleet doc reports Claude Code failing on production on 2026-09-26 (see caveats).",
   "checked": "2026-10-11"
  },
  "harness_api": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs/sdk/typescript",
   "quote": "dispatchPrompt(message, { sessionId, turnId }) returns after admission and lets the run continue after the caller disconnects.",
   "note": "First-party prompt/session API (box.prompt, box.session(id).prompt, streamPrompt) over the chosen harness.",
   "checked": "2026-10-11"
  },
  "code_interpreter": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs/comparison",
   "quote": "Code exec with structured results (image / dataframe / json / html)",
   "note": "Table row marked for Tangle; box.runCode with a persistent kernel.",
   "checked": "2026-10-11"
  },
  "browser": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs/templates",
   "quote": "Node 22 LTS, pnpm, tsx, vitest, esbuild, Playwright (Chromium with system deps)",
   "note": "Chromium ships in the public node-typescript template, not necessarily in the default image.",
   "checked": "2026-10-11"
  },
  "computer_use": {
   "value": null,
   "source": "https://docs.tangle.tools/sandbox/sdk/interactive",
   "quote": "Computer-use support depends on the sandbox image and deployment.",
   "note": "Computer tools are exposed through MCP when the sandbox is created with capabilities: [\"computer_use\"]. It is not described what the computer tools control (no desktop GUI, screen or input API is documented) and support is image- and deployment-dependent, so the card leaves computer_use unknown rather than let the engine derive 'browser + desktop control'.",
   "checked": "2026-10-11"
  },
  "mcp_server": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs/comparison",
   "quote": "Hosted MCP endpoint (paste-into-Claude)",
   "note": "Manifest lists https://id.tangle.tools/mcp.",
   "checked": "2026-10-11"
  },
  "credential_injection": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs/cli",
   "quote": "Secrets are encrypted key/value pairs injected into the sandbox environment at boot.",
   "note": "Injected as environment variables (the secret enters the sandbox); no outbound secret proxy is documented, so secret_proxy is unset.",
   "checked": "2026-10-11"
  },
  "scoped_api_keys": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs/authentication",
   "quote": "Scoped tokens expire in minutes. They do not replace the account key; they reduce what a delegated client can reach if that client is compromised.",
   "note": "Credential types: account API key (sk-tan-), session, project, session-runtime, read-only and capability tokens.",
   "checked": "2026-10-11"
  },
  "spend_limits": {
   "value": true,
   "source": "https://sandbox.tangle.tools/.well-known/tangle-agent.json",
   "quote": "optional lifetime spend cap shared by every granted product, 1-1000, default 10",
   "note": "Spend cap on agent-signup keys (budget_usd); GPU leases also require maxSpendUsd.",
   "checked": "2026-10-11"
  },
  "gpu": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs/gpu-leases",
   "quote": "GPU leases are temporary GPU workers attached to an ordinary sandbox only while a command needs acceleration.",
   "note": "GPUs are leased from third-party clouds (runpod, vast-ai, lambda-labs, ...); 'Billing is recorded in seconds.' No per-GPU price is published, so mode.gpu is null.",
   "checked": "2026-10-11"
  },
  "lang_python": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs/comparison",
   "quote": "Multi-language (Python, JS, TS, Bash)",
   "checked": "2026-10-11"
  },
  "lang_node": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs/comparison",
   "quote": "Multi-language (Python, JS, TS, Bash)",
   "checked": "2026-10-11"
  },
  "linux": {
   "value": true,
   "source": "https://sandbox.tangle.tools/docs",
   "quote": "Tangle Sandbox gives applications isolated Linux computers for code, agents, evaluation, CI, and remote development.",
   "checked": "2026-10-11"
  },
  "isolation": {
   "value": null,
   "source": "https://sandbox.tangle.tools/docs",
   "quote": "A sandbox may run through a managed container, a microVM, or an operator-backed driver; the SDK presents the same lifecycle and runtime surface across them.",
   "note": "Which driver hosted sandboxes use is not published. docs.tangle.tools/sandbox says 'Each sandbox is a dev container or microVM'; the GPU doc mentions 'Docker and Firecracker sandboxes'. None says what a default create gets, so isolation stays null (no VM claim).",
   "checked": "2026-10-11"
  },
  "docker_inside": {
   "value": null,
   "source": null,
   "quote": null,
   "note": "No public doc says Docker runs inside a sandbox.",
   "checked": "2026-10-11"
  },
  "root": {
   "value": null,
   "source": null,
   "quote": null,
   "note": "No public doc says the sandbox user has root.",
   "checked": "2026-10-11"
  },
  "regions": {
   "value": null,
   "source": null,
   "quote": null,
   "note": "No public region list. The API schema has a free-form driver.preferredRegion string with no published values.",
   "checked": "2026-10-11"
  },
  "max_size": {
   "value": null,
   "source": "https://docs.tangle.tools/sandbox/sdk/access",
   "quote": "client.shapes() returns named sizes and the account’s resource ceiling.",
   "note": "Size limits are returned per account by an authenticated call; none are published.",
   "checked": "2026-10-11"
  },
  "confidential_compute": {
   "value": true,
   "source": "https://docs.tangle.tools/sandbox/sdk/access",
   "quote": "These calls require a confidential-compute deployment; ordinary hosted sandboxes do not imply TEE support.",
   "note": "Not a card feature key; recorded so the TEE row on the comparison page is not read as hosted-default.",
   "checked": "2026-10-11"
  }
 }
}