Skip to content

How it works

Anthara is a set of services that run on infrastructure you control. This page describes each service, and then follows two paths through them: a developer’s Claude Code session, and a workflow run.

Service What it does
Web app The dashboard. Every page in these docs that names a button or a tab refers to this app.
API The backend for the web app. It handles sign-in, repositories, assessments, standards packs, connections, and workflows.
Fabric Stores memory in a knowledge graph and keeps the catalog of coding standards. It exposes both to AI sessions as an MCP server.
LLM Proxy A proxy in front of the model provider. Model registration, tool rules, data protection, request logs, and usage all live here. Data protection uses Presidio to detect personal data.
Workers Short-lived containers on a k3s cluster. Each workflow step runs in its own worker.
Data stores PostgreSQL for application data, FalkorDB for the memory graph, and Redis for queues.

Each deployment serves one organization. There is no separate tenant or organization record in the API.

How standards reach a developer’s session

Section titled “How standards reach a developer’s session”
  1. An admin or developer creates packs of rules under AI Coding Standards. A pack is either org-wide or applied to specific repositories.
  2. The API pushes the pack catalog and the repository assignments to Fabric.
  3. On a repository page, someone selects Activate. Anthara opens a pull request that adds the anthara plugin and its configuration to that repository.
  4. After the pull request merges, Claude Code loads the plugin for every developer who opens the repository.
  5. The plugin connects to Fabric at /mcp/<memory group> over Streamable HTTP. The developer signs in once in the browser.
  6. During a session, the plugin asks Fabric for the standards that apply to the repository and to the task. Fabric returns the org-wide rules together with the rules assigned to that repository.

Packs are not copied into the repository as files. They are served from Fabric each time a session asks for them, so a change to a pack applies to the next request.

Fabric keeps two kinds of memory. Private memory belongs to one person. Shared memory belongs to the organization and is visible to everyone connected to it.

The plugin writes to memory through two separate MCP tools, add_private_memory and add_shared_memory. The plugin asks the developer for permission before each shared write. Both kinds are searched with search_memories.

  1. A workflow starts from one of its triggers: a person selecting Run, a cron schedule, a GitHub event, or an Azure DevOps event.
  2. The API queues the run and executes the steps in order.
  3. Each ai_task or coding_task step starts a worker on the k3s cluster. The worker runs an agent with the Claude Agent SDK and loads the anthara plugin, so the agent reads the same standards from Fabric that a developer’s session reads.
  4. A coding_task step clones the repositories it was given, makes the change on a branch named anthara/<slug>, pushes the branch, and opens a pull request.
  5. When a step is interactive, the agent posts a card to a Microsoft Teams channel and the run pauses. The run shows the status Collaboration Loop until someone answers the card. Then a new worker resumes the same session.
  6. The run ends as Completed, Failed, or Cancelled.

Admins manage the proxy from the Govern section of the web app.

  • Models lists the models that can be requested and where each one is routed.
  • MCP Registry holds the rules for which tools an agent may call.
  • Data Protection masks or blocks personal data in requests and responses. It is off until an admin turns it on.
  • Logs and Usage show what was requested and what it cost.

Two paths do not always pass through the proxy, and a security reviewer should know about both:

  • Workflow runs use the proxy only when an admin has turned on the Workflow LLM gateway setting. When the setting is off, workers call the model provider directly.
  • Repository assessments run inside the API and call the model provider directly.