`; document.body.appendChild(el); return el; } const bubble = ensureBubble(); const elH = bubble.querySelector("#tt-title"); const elB = bubble.querySelector("#tt-body"); const elClose = bubble.querySelector(".tt-close"); // ---------------- Parse [[term|heading|body]] anywhere ---------------- const TOKEN_RE = /\[\[([^|\]]+)\|([^|\]]+)\|([^\]]+)\]\]/g; const BLOCK_SKIP = new Set(["SCRIPT","STYLE","NOSCRIPT","TEXTAREA","INPUT","SELECT","CODE","PRE","TEMPLATE","IFRAME"]); function shouldSkipTextNode(n){ let el = n.parentElement; while (el){ if (BLOCK_SKIP.has(el.tagName) || el.isContentEditable) return true; el = el.parentElement; } return false; } const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT); const textNodes = []; while (walker.nextNode()){ const n = walker.currentNode; if (!n.nodeValue || shouldSkipTextNode(n)) continue; if (TOKEN_RE.test(n.nodeValue)) textNodes.push(n); TOKEN_RE.lastIndex = 0; } textNodes.forEach(node => { const frag = document.createDocumentFragment(); const insideLink = !!node.parentElement.closest("a"); let text = node.nodeValue, last = 0; TOKEN_RE.lastIndex = 0; let m; while ((m = TOKEN_RE.exec(text))){ if (m.index > last) frag.appendChild(document.createTextNode(text.slice(last, m.index))); const term=m[1].trim(), heading=m[2].trim(), body=m[3].trim(); const t = insideLink ? document.createElement("span") : document.createElement("button"); if (insideLink){ t.setAttribute("role","button"); t.setAttribute("tabindex","0"); } else { t.type="button"; } t.className="tt-trigger"; t.textContent=term; t.setAttribute("data-tt-h", heading); t.setAttribute("data-tt-b", body); t.setAttribute("aria-haspopup","dialog"); t.setAttribute("aria-expanded","false"); frag.appendChild(t); last = TOKEN_RE.lastIndex; } if (last < text.length) frag.appendChild(document.createTextNode(text.slice(last))); node.parentNode.replaceChild(frag, node); }); // ---------------- State ---------------- let current = null; let hoverCount = 0; let closeTimer = null; // Dimming bookkeeping let dimCtx = null; // { container, dimEls:[], wrappedTexts:[], pathEls:[] } // ---------------- Find the correct "text element" container ---------------- function findTextContainer(trigger){ // Prefer common RTE wrappers let el = trigger.closest(".w-richtext, .rich-text, .rte, [data-rte]"); if (el) return el; // Otherwise climb until we find an ancestor that contains multiple block nodes anywhere inside. const BLOCK_SEL = "p,h1,h2,h3,h4,h5,h6,ul,ol,li,blockquote,pre,figure,figcaption"; el = trigger.parentElement; while (el && el !== document.body){ const blockCount = el.querySelectorAll(BLOCK_SEL).length; if (blockCount >= 2) return el; el = el.parentElement; } // Fallback: nearest non-inline container el = trigger.parentElement || document.body; while (el && el !== document.body){ const d = getComputedStyle(el).display; if (d !== "inline" && d !== "contents") return el; el = el.parentElement; } return document.body; } // Utility: child of `ancestor` that contains `target` (direct child) function directChildContaining(ancestor, target){ for (const ch of ancestor.children){ if (ch === target || ch.contains(target)) return ch; } return null; } function getElementTarget(e) { // If target is already an Element, use it if (e.target instanceof Element) return e.target; // Otherwise, walk the composed/path for the first Element const path = (typeof e.composedPath === 'function') ? e.composedPath() : []; for (const n of path) if (n instanceof Element) return n; return null; } // ---------------- Dim everything except the trigger branch (sibling branches only) ---------------- function dimAllOtherBranches(container, trigger){ undim(); // clear previous const dimEls = []; const wrappedTexts = []; const pathEls = []; // Build ELEMENT-only path [container -> ... -> trigger] const path = []; for (let el = trigger; el && el !== container; el = el.parentElement) path.push(el); path.push(container); path.reverse(); // At each ancestor level, find the *direct* child that leads to the trigger for (let i = 0; i < path.length; i++){ const anc = path[i]; const branchChild = (i < path.length - 1) ? directChildContaining(anc, path[i+1]) : path[i]; // last step is the trigger itself // Fade element siblings (whole branches) for (const child of anc.children){ if (child === branchChild) continue; // keep the path branch crisp // Never fade any element that is (or contains) the trigger if (child === trigger || child.contains(trigger)) continue; child.style.transition = `opacity ${DIM_EASE_MS}ms ease`; child.style.opacity = String(DIM_OPACITY); dimEls.push(child); } // Fade TEXT NODE siblings directly under this ancestor (outside branchChild) anc.childNodes.forEach(node => { if (node.nodeType !== 3) return; // text only if (!node.nodeValue || !node.nodeValue.trim()) return; // If this text node sits inside branchChild, skip if (branchChild && branchChild.contains && branchChild.contains(node)) return; const span = document.createElement("span"); span.style.transition = `opacity ${DIM_EASE_MS}ms ease`; span.style.opacity = String(DIM_OPACITY); span.textContent = node.nodeValue; node.parentNode.replaceChild(span, node); wrappedTexts.push(span); }); // Keep a reference to the path elements (so we can explicitly restore opacity if needed) if (anc && anc.nodeType === 1) pathEls.push(anc); } // Hard-guard: explicitly set opacity:1 on the entire path to neutralize any inherited fade pathEls.forEach(el => { el.style.opacity = "1"; }); dimCtx = { container, dimEls, wrappedTexts, pathEls }; } function undim(){ if (!dimCtx) return; const { dimEls, wrappedTexts, pathEls } = dimCtx; // Animate back dimEls.forEach(el => { el.style.transition = `opacity ${DIM_EASE_MS}ms ease`; el.style.opacity = "1"; // remove inline style after the animation so we don't override site CSS setTimeout(() => { if (el) el.style.opacity = ""; }, DIM_EASE_MS + 50); }); wrappedTexts.forEach(span => { span.style.transition = `opacity ${DIM_EASE_MS}ms ease`; span.style.opacity = "1"; span.addEventListener("transitionend", () => { if (!span.parentNode) return; span.parentNode.replaceChild(document.createTextNode(span.textContent || ""), span); }, { once:true }); }); // Clear hard-guard on path pathEls.forEach(el => { if (el) el.style.opacity = ""; }); dimCtx = null; } // ---------------- Positioning (centered, edge-aware, flip) ---------------- function clamp(v,min,max){ return Math.max(min,Math.min(max,v)); } function measureBubbleForPlacement(){ const wasOpen = bubble.classList.contains("is-open"); if (!wasOpen){ bubble.style.visibility="hidden"; bubble.classList.add("is-open"); } const rect = bubble.getBoundingClientRect(); if (!wasOpen){ bubble.classList.remove("is-open"); bubble.style.visibility=""; } return { w: rect.width, h: rect.height }; } function placeAnchored(trigger){ const vw=innerWidth, vh=innerHeight; const r = trigger.getBoundingClientRect(); const { w, h } = measureBubbleForPlacement(); let left = r.left + (r.width/2) - (w/2); left = clamp(left, EDGE_PADDING, Math.max(EDGE_PADDING, vw - EDGE_PADDING - w)); const topBelow = r.bottom + OFFSET_Y; const spaceBelow = vh - topBelow - EDGE_PADDING; const placeBelow = spaceBelow >= h; let top = placeBelow ? topBelow : (r.top - h - OFFSET_Y); top = clamp(top, EDGE_PADDING, Math.max(EDGE_PADDING, vh - EDGE_PADDING - h)); bubble.style.left = left + "px"; bubble.style.top = top + "px"; const br = bubble.getBoundingClientRect(); if (br.bottom > vh - EDGE_PADDING){ bubble.style.maxHeight = (vh - 2*EDGE_PADDING) + "px"; bubble.style.overflowY = "auto"; } else { bubble.style.maxHeight = "none"; bubble.style.overflowY = "visible"; } } // ---------------- Open / Close (place → fade/scale) ---------------- function animateIn(){ bubble.style.transition = "none"; bubble.style.opacity = "0"; bubble.style.transform = "scale(0.95)"; void bubble.offsetWidth; bubble.style.transition = "opacity .18s ease, transform .18s ease"; bubble.style.opacity = "1"; bubble.style.transform = "scale(1)"; } function animateOut(done){ bubble.style.transition = "opacity .16s ease, transform .16s ease"; bubble.style.opacity = "0"; bubble.style.transform = "scale(0.95)"; const end = () => { bubble.removeEventListener("transitionend", end); done && done(); }; bubble.addEventListener("transitionend", end); setTimeout(end, 260); } function openFromTrigger(trigger){ if (current && current !== trigger) forceClose(); current = trigger; trigger.setAttribute("aria-expanded","true"); elH.textContent = trigger.getAttribute("data-tt-h") || ""; elB.textContent = trigger.getAttribute("data-tt-b") || ""; bubble.classList.add("is-open"); bubble.setAttribute("aria-hidden","false"); placeAnchored(trigger); animateIn(); const container = findTextContainer(trigger); dimAllOtherBranches(container, trigger); hoverCount = 0; cancelCloseTimer(); } function forceClose(){ if (!current) return; bubble.classList.remove("is-open"); bubble.setAttribute("aria-hidden","true"); current.setAttribute("aria-expanded","false"); current = null; undim(); hoverCount = 0; cancelCloseTimer(); } function closeWithAnim(){ if (!current) return; const t = current; animateOut(() => { bubble.classList.remove("is-open"); bubble.setAttribute("aria-hidden","true"); t.setAttribute("aria-expanded","false"); current = null; undim(); }); } function scheduleClose(){ cancelCloseTimer(); closeTimer = setTimeout(() => { if (hoverCount <= 0 && !isCoarse()) closeWithAnim(); }, CLOSE_DELAY); } function cancelCloseTimer(){ if (closeTimer){ clearTimeout(closeTimer); closeTimer = null; } } // ---------------- Hover-intent (desktop) ---------------- function onZoneEnter(){ if (isCoarse()) return; hoverCount++; cancelCloseTimer(); } function onZoneLeave(){ if (isCoarse()) return; hoverCount = Math.max(0, hoverCount - 1); if (hoverCount === 0) scheduleClose(); } bubble.addEventListener("pointerenter", onZoneEnter, true); bubble.addEventListener("mouseenter", onZoneEnter, true); bubble.addEventListener("pointerleave", onZoneLeave, true); bubble.addEventListener("mouseleave", onZoneLeave, true); const handleEnter = (e) => { if (isCoarse()) return; const target = getElementTarget(e); if (!target) return; const t = target.closest(".tt-trigger"); if (!t) return; onZoneEnter(); if (!current || current !== t) openFromTrigger(t); }; const handleLeave = (e) => { if (isCoarse()) return; const target = getElementTarget(e); if (!target) return; const t = target.closest(".tt-trigger"); if (!t) return; onZoneLeave(); }; document.addEventListener("pointerenter", handleEnter, true); document.addEventListener("mouseenter", handleEnter, true); document.addEventListener("pointerleave", handleLeave, true); document.addEventListener("mouseleave", handleLeave, true); // ---------------- Keyboard ---------------- document.addEventListener("focusin", (e) => { if (!e.target) return; const t = e.target.closest(".tt-trigger"); if (t) openFromTrigger(t); }); document.addEventListener("focusout", (e) => { if (!e.target) return; const t = e.target.closest(".tt-trigger"); if (t && current === t) closeWithAnim(); }); // ---------------- Mobile / coarse ---------------- document.addEventListener("pointerdown", (e) => { if (!isCoarse()) return; const t = e.target.closest(".tt-trigger"); if (!t) return; e.preventDefault(); e.stopPropagation(); if (current === t && bubble.classList.contains("is-open")) { closeWithAnim(); return; } openFromTrigger(t); }, true); document.addEventListener("click", (e) => { if (!isCoarse()) return; if (!bubble.classList.contains("is-open")) return; const inBubble = !!e.target.closest(".tt-bubble"); const onTrigger = !!e.target.closest(".tt-trigger"); if (!inBubble && !onTrigger) closeWithAnim(); }, true); // Close button + ESC elClose.addEventListener("click", closeWithAnim); document.addEventListener("keydown", (e) => { if (e.key === "Escape") closeWithAnim(); }); // Reposition on resize/scroll while open const reposition = () => { if (!current) return; placeAnchored(current); }; addEventListener("resize", reposition, { passive: true }); addEventListener("scroll", reposition, { passive: true }); });

The enterprise
coding agent for
every environment

Claude Code for enterprise autonomously writes, debugs, and refactors code with support for terminal and any IDE to help teams ship faster.

Get Enterprise plan
Try Claude Code
Play video

Trusted by leading engineering teams

Read story

"Our engineers are now able to execute fleet-wide migrations at a pace that simply wasn't possible before. It's a promising sign of how AI can reduce the complexity of maintaining large code bases and a clear signal of how AI is reshaping development velocity.”

Max Charas, Senior Staff Engineer
Read story

79%

reduced time to market for new features (from 24 days to 5 days)
Read story

Read story

“Claude Code is moving our team up a level: we decide what needs to happen, and smooth the process so it can build and verify end-to-end. A big part of my job now is to keep as many instances of Claude Code busy as possible.”

Simon Last, Co-founder
Read story

89%

employee adoption, 800+ AI agents deployed, 10x app usage growth 
Read story

1M+

lines of AI-suggested code implemented in just 30 days
Read story

“The level of support has built trust in both Claude Code and Anthropic, making it easier for us to expand our use of the tool.”

Austin Ray, Senior Software Engineer
Read story

Read story

"Claude Code has helped me become a better engineer," said Signoretti. "As AI continues to evolve, I expect my role to become more and more creative—unlocking a lot of time for system design, as well as understanding the ideal us"

Francesco Signoretti, Engineering Lead, Developer Experience AI
Read story

Read story

“Claude Code has transformed how we build internal tools at Shopify.”

Andrew McNamara, Director of Applied AI
Read story

Read story

"This project would never have happened without Claude Code. The amount of effort and time that we would have needed to invest—we just wouldn’t do it.”

Liran Benodis, Team Lead, Data Security Posture Management
Read story
Prev
0/5
Next

The Claude Code difference

Approved by enterprise engineering leaders at global organizations.

Agentic, not autocomplete

Claude Code builds entire features in natural language. It writes the code, creates the tests, and opens the PR so your team spends less time on implementation and more time on decisions.

Works everywhere

Terminal, desktop, any IDE, Slack, or web. Claude Code fits into your team's existing workflow instead of replacing it, so developers adopt it without changing how they work.

Full codebase context

Claude searches your whole codebase, not just the open file. That full context is what enables legacy codebase migration, debugging across files, and meaningful code reviews.

Built on the best models 

Claude consistently leads coding benchmarks. As our models improve, your team gets the benefit automatically with no workflow changes, no migrations, and no retraining.

2026 Agentic Coding Trends Report

How is AI changing the way software gets built—and what should engineering leaders expect in 2026? We analyzed the patterns emerging across the industry.

Read more
Code modernization

Claude Code helps leading enterprises modernize legacy codebases, assisting with scalable migration while maintaining business logic integrity.

Learn more
Prev
Next

Built for enterprise engineering

Manage Claude Code across your org with the visibility and guardrails enterprise teams need.

Contribution metrics

See usage patterns and productivity gains from your team in a single dashboard, including PRs and committed code written with Claude Code's help.

Server managed settings

Configure Claude Code centrally for your org. Set tool permissions, file access restrictions, and MCP server configurations from one admin panel. No MDM required.

OpenTelemetry monitoring

Export real-time Claude Code metrics to your observability stack with OpenTelemetry. Track session activity, token usage, and costs without building custom integrations.

Access and permissions

Control access with fine-grained role-based permissions and manage seats with SSO. Enterprise plans add SCIM for automated provisioning, audit trails, and seat allocation visibility.

Security taken seriously

Enterprise governance is built in with SOC 2 Type II compliance, SSO, role-based permissions, and organization-wide policy enforcement.

Read more about Anthropic's safety and compliance in our Trust Center.

Bring your own keys

Run Claude Code using keys from Amazon Bedrock, Google Vertex AI, or Microsoft Foundry within your existing VPC.

SSO and SCIM

Integrate with Okta, Azure AD, or any SAML 2.0 provider. Enterprise plans add SCIM for automated provisioning.

Encrypted everywhere

TLS 1.3 in transit, AES-256 at rest. All data encrypted end-to-end with your keys if needed.

Solve problems that
slow developers down

Get Enterprise plan

Development without leaving your environment

Debug, review, and ship code directly in your terminal or editor of choice. Claude Code is available in any IDE plus in VS Code via its native extension.

Collaborate without leaving Slack

Debug, review, and ship code directly in Slack. Your team's conversations become development sessions, with Claude Code providing context-aware assistance right in your channels.

Review code faster

Analyze PRs automatically before human review. Claude Code checks against your organization's standards, flags issues, and suggests improvements right in your workflow.

Do more with Claude Code for Enterprise

Enterprise

Enterprise plan premium seats include everything in the Team plan, plus advanced security, data, and user management.

Get Enterprise plan
Talk to sales

Team

Claude Code is included with Team plan. Includes self-serve seat management and additional usage at standard API rates, & access to both Sonnet 4.6 and Opus 4.6.

$150

Per person / month. Minimum 5 members.

Get Team plan
Learn more

Extra usage limits apply. Prices shown don’t include applicable tax.

Trusted by engineering teams at leading global organizations

logologo
logologo
logologo
logologo
logologo
logologo
logologo
logologo
logologo
logologo
logologo
logologo
logologo
logologo
logologo
logologo
logologo
Already using Amazon Bedrock, Google Vertex AI, or Microsoft Foundry?

You can configure Claude Code to work with third party API keys. 

Read API docs

FAQ

Yes. Claude Code runs locally in your terminal and talks directly to model APIs without requiring a backend server or remote code index. It also asks for permission before making changes to your files or running commands.

Claude Code works with the Opus 4.6, Sonnet 4.6, and Haiku 4.5 models. Enterprise users can run Claude Code using models in existing Amazon Bedrock or Google Cloud Vertex AI instances.

Claude Code deploys through AWS Bedrock, Google Vertex AI, or Azure, integrating with your existing IAM, CloudTrail logging, and VPC configurations. All data stays within your control and complies with SOC 2 Type II standards.

Yes. Deploy CLAUDE.md files to system directories for company-wide standards, or create repository-specific files for project architecture and contribution guidelines. Claude Code references these automatically.

Everything in Team, plus advanced security, data, and user management, including: SCIM, role-based permissions, custom data retention, and IP allowlisting.

Enterprise plans include dedicated support, custom deployment guidance, onboarding assistance, and priority response times. We work with your team to ensure successful rollout.

We do not train Claude on your Enterprise data. Your code, conversations, and proprietary information remain private and are not used to improve our models.

Deploy through Anthropic Cloud (SaaS), Amazon Bedrock, Google Cloud's Vertex AI, and Microsoft Foundry. Enterprise teams can use VPC isolation and private endpoints for maximum security.

2x

faster execution speed for delivering features and fixes

99.9%

accuracy on complex code modifications

Prev
Next

Transform how your organization operates with Claude

Get Enterprise plan
Contact sales