How audytx works
audytx is a GitHub App that posts one comment per pull request showing cost optimization opportunities and security findings on your AWS Terraform changes. This page covers what it checks, how it stays out of your way, and how to install it.
Install
Click Install on GitHub, pick the repository, and approve. The App needs:
- Contents: Read-only — to fetch the PR's changed files.
- Pull requests: Read and write — to post the comment.
- Metadata: Read-only — required by GitHub for every App.
- Code scanning alerts: Read and write — for SARIF upload (when enabled).
Subscribed events: pull_request. We listen for
opened, synchronize, and reopened — other
actions (labels, edits, etc.) are ignored to keep noise down.
Use from a coding agent (MCP)
audytx is also an MCP server — the same engine the GitHub App runs, callable by any MCP-capable coding agent (Claude Code, Cursor, and friends) before the PR exists. No CI, no token, no install:
claude mcp add --transport http audytx https://audytx.com/mcp
Two tools:
-
scan_terraform— pass all.tf/.tfvarsfiles, get findings with file:line evidence, severity, fix snippets, and the findings the context layer suppressed as false positives, each with its rationale. Pass the complete file set — cross-resource reasoning (IAM trust graphs, attack paths, DLQ identity) is blind to files you omit. -
autofix_terraform— audytx applies its sound fixes server-side (only precisely line-anchored replacements — the same bar as GitHub one-click suggestions, never a corrupting edit), re-scans, and loops until nothing auto-fixable remains. Returns the fixed file contents plus the findings left for the agent to fix itself.
Transport: stateless Streamable-HTTP JSON-RPC at POST /mcp.
Limits: 400 files / 3 MB per call. File contents are processed in
memory and never persisted — same privacy posture as the
GitHub App path. scan_terraform also
accepts an optional plan argument (your
terraform show -json output) for the same enrichment described
below — handy when the agent has already run a plan.
Plan-enhanced scans (optional)
Static parsing can't see everything: values behind variables with no
default, count/for_each expansion, and resources
inside modules. If you run terraform plan in CI, you can hand
audytx the resolved plan and it will scan with those final values folded in
— surfacing findings the source-only scan can't. Strictly opt-in and
additive: the normal scan keeps working exactly as before; this only
ever adds signal.
Add this workflow. It authenticates with the run's GitHub OIDC token — nothing to paste, no secret to store; audytx verifies the token and scopes it to your repo automatically:
# .github/workflows/audytx-plan.yml
on: [pull_request]
permissions:
contents: read
id-token: write # lets the job mint an OIDC token
jobs:
audytx-plan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
- run: terraform init -backend=false && terraform plan -out=tf.plan && terraform show -json tf.plan > plan.json
- name: Upload plan to audytx
env:
AUD: https://audytx.com
run: |
OIDC=$(curl -sH "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=$AUD" | jq -r .value)
PR=$(jq -r .number "$GITHUB_EVENT_PATH")
SHA=$(jq -r .pull_request.head.sha "$GITHUB_EVENT_PATH")
jq -n --slurpfile p plan.json \
--arg repo "$GITHUB_REPOSITORY" --argjson pr "$PR" --arg sha "$SHA" \
'{repo:$repo, pr_number:$pr, head_sha:$sha, plan:$p[0]}' > body.json
curl -sf -X POST "$AUD/plan-upload" \
-H "Authorization: Bearer $OIDC" -H "Content-Type: application/json" \
--data-binary @body.json
Limits: 5 MB per upload. The plan JSON is processed in memory and never persisted — same posture as your source files. The PR comment notes a 🔬 plan-enhanced scan in its footer when plan data was used. If the upload fails for any reason, your normal scan still stands.
What we check
200+ rules across operations, security, reliability, and cost. The catalog is opinionated and AWS-only — we don't try to cover every cloud at a shallow depth.
Context-aware reasoning
Most IaC scanners are single-resource pattern matchers — they flag a Lambda for missing DLQ regardless of whether anything async invokes it. audytx pre-computes four cross-resource axes before evaluating each rule:
- DLQ identity. Which SQS queues are themselves a DLQ. A DLQ doesn't need its own DLQ.
- Lambda invocation graph. Sync (API Gateway, Function URL) vs async-push (SNS / S3 / EventBridge) vs polled-async (SQS ESM, Kinesis ESM). Lambda DLQ only helps async-push.
-
Encryption variants. KMS-CMK vs AWS-managed vs
service-managed (e.g.
sqs_managed_sse_enabled = trueis real encryption — the strict-CMK ask is a separate rule). - Data lifetime. DynamoDB TTL, S3 lifecycle, CloudWatch Logs retention. Ephemeral tables don't need PITR.
Rules consult these predicates as a post-filter, so a single-resource scanner's checklist doesn't fire false positives on legitimate patterns.
The reasoning is visible. Findings the context layer
reclassified as false positives don't silently disappear — each appears
in the PR comment under a collapsed 🧠 audytx reasoned about N
findings and chose not to flag them block, with the rule ID, the
resource address, and a one-sentence rationale ("queue is itself a
dead-letter queue", "Lambda is not invoked async-push", "table actively
expires its own data via TTL"). The same reasoning rides into
GitHub's Code Scanning Security tab as a SARIF suppressions[]
justification — alerts there show as "closed (dismissed)" with the
rationale visible in the alert detail. A security review sees not just
what fired, but what audytx considered and dismissed, and why.
Live inventory of axes + the rules that consult each is available at
/status under
context_reasoning_axes.
GitHub Code Scanning integration (SARIF)
Alongside the PR comment, audytx uploads a SARIF v2.1.0 document
to GitHub's Code Scanning API at every scan. Findings appear in
the repo's Security tab as alerts — with
file:line annotations, severity grouping, framework-tag filter
chips (aws-fsbp-s3.1, soc2-cc6.1),
and stable per-finding fingerprints so the same alert tracks
across PR pushes.
Why this matters for procurement: security teams that have standardised on Code Scanning (Dependabot, CodeQL, etc.) don't need to learn a new dashboard. audytx is just another alert source in the same place.
Requirements. SARIF upload requires either a
public repo, or a private repo with GitHub Advanced Security.
Private repos without GHAS still get the PR comment — the
Security tab integration just no-ops. We log the failure to
wrangler tail and continue.
SARIF severity mapping:
- Critical + High → SARIF
error - Medium → SARIF
warning - Low + Informational → SARIF
note
Reasoning visible in the Security tab. When the engine
reasons a finding away as a false positive (see
Context-aware reasoning), the finding still goes
into the SARIF payload — but with a suppressions[] array
carrying the engine's justification. GitHub's Code Scanning UI shows
these as closed (dismissed) alerts and surfaces the
justification alongside the alert detail. A security review of the
Security tab sees not just what fired, but what audytx considered and
dismissed — and why.
Suppressing false positives
Add a .audytx-baseline.yaml file to your repo root:
ignored_findings:
- rule_id: AWS_LAMBDA_004
resource_address: aws_lambda_function.api
reason: "API GW sync invocation — DLQ is a semantic mismatch"
expires: 2026-12-31
- rule_id: AWS_IAM_001
resource_address: aws_iam_role.legacy_admin
reason: "Legacy admin role; removal scheduled Q3"
expires: 2026-09-30
The expires: field is required — suppressions
without an expiry rot silently into never-relitigated tech debt. An expired
entry stops suppressing and the finding reappears, forcing
re-justification.
Suppressed findings still appear in the comment under a "Suppressed" appendix so auditors see what was acknowledged.
Privacy Policy
Effective: 1 June 2026 · Operator: Rexstart Labs Pvt Ltd · Contact: hello@audytx.com
What we collect
- GitHub App path. When a pull request is opened, audytx fetches
.tfand.tfvarsfiles from your repository via the GitHub Contents API. These files are loaded into memory on a Cloudflare edge worker, analyzed, and immediately discarded. No source file content is written to any database or log. - Scan metadata. Our D1 database records: GitHub App installation ID, repository name, PR number, engine version, rule catalog version, finding count, and scan duration. No file content, no secrets, no personally identifiable information beyond the GitHub identifiers you consented to share when installing the App.
- MCP path. Requests to
POST /mcpare stateless. File contents sent in the request body are processed in memory and never written anywhere. No request body is logged. - Web analytics. We do not use third-party analytics scripts. Cloudflare Workers observability (enabled) records request counts, error rates, and latency percentiles — no user-level tracking, no cookies, no fingerprinting.
What we do not collect
- Terraform source code, HCL file contents, or any infrastructure configuration beyond what is required to produce a scan result — and that content is never persisted.
- AWS credentials, secrets, or sensitive values found in scanned files. If a hardcoded secret is detected, the finding references the file path and line number only — the secret value is never stored.
- IP addresses in our application database. Cloudflare may log IPs transiently at the network layer per their own privacy policy.
Data retention
- Scan metadata records are retained for 90 days, then automatically deleted.
- Removing the GitHub App from your repository or organization immediately and permanently revokes audytx's access. No separate deletion request is needed.
- To request deletion of scan metadata records for your installation, email hello@audytx.com with your GitHub installation ID. We will delete within 7 days and confirm by reply.
Data location
All processing runs on Cloudflare's global edge network. Scan metadata is stored in Cloudflare D1 (SQLite, US region). No data is transferred to third-party analytics, advertising, or data-broker services.
Changes
Material changes to this policy will be announced via the GitHub App release notes at least 14 days before taking effect. The effective date above is updated on each revision.
Terms of Service
Effective: 1 June 2026 · Operator: Rexstart Labs Pvt Ltd · Contact: hello@audytx.com
Acceptance
By installing the audytx GitHub App or sending requests to audytx.com/mcp, you agree to these terms. If you do not agree, uninstall the App and discontinue use.
Permitted use
- audytx is provided for the purpose of analyzing AWS Terraform infrastructure-as-code for security and cost findings.
- You may use audytx on repositories you own or have explicit authorization to scan.
- Automated use via the MCP endpoint is permitted within the published rate limits.
Prohibited use
The following are strictly prohibited and will result in permanent account termination:
- Abuse of the scan infrastructure. Deliberate attempts to overload, circumvent rate limits, or degrade service for other users — including automated flood attacks, distributed request amplification, and rate-limit evasion.
- Unauthorized scanning. Using audytx to scan repositories, code, or infrastructure you do not own and have not been explicitly authorized to scan.
- Extraction or reverse-engineering. Attempting to extract, reconstruct, or reverse-engineer audytx's rule logic, scoring weights, or engine internals through systematic probing or differential analysis.
- Resale or white-labeling. Reselling, sublicensing, or white-labeling audytx's output or API without written permission from Rexstart Labs Pvt Ltd.
- Malicious input. Sending crafted input designed to exploit vulnerabilities in the analysis engine, including prompt injection via Terraform file contents targeting the MCP surface.
Reporting violations
Report abuse, violations of these terms, or suspected misuse to abuse@audytx.com. Include as much detail as possible: timestamps, GitHub usernames or installation IDs, and a description of the observed behavior. All reports are investigated. Confirmed violators are permanently banned from the GitHub App and the MCP endpoint, with no reinstatement path.
Service availability
- audytx is provided free of charge on a best-effort basis. We make no uptime guarantees.
- We reserve the right to rate-limit, suspend, or terminate access to any installation or IP address that violates these terms or degrades service for others, without prior notice.
- We may modify, suspend, or discontinue the service at any time. We will provide reasonable advance notice via the GitHub App release notes where practical.
Intellectual property
audytx's rule catalog, engine, and all associated software are the property of Rexstart Labs Pvt Ltd. Your Terraform source code remains entirely your property. We claim no rights over the code you submit for analysis.
Disclaimer and limitation of liability
audytx is a static analysis tool. Findings are provided for informational purposes only and do not constitute a security audit, legal advice, or a guarantee that your infrastructure is free of vulnerabilities. Use findings as one input in your security review process, not as a substitute for it. To the maximum extent permitted by applicable law, Rexstart Labs Pvt Ltd is not liable for any damages arising from your use of or reliance on audytx findings.
Governing law
These terms are governed by the laws of India. Disputes shall be subject to the exclusive jurisdiction of the courts of Bangalore, Karnataka, India.
Current limits
- AWS only. No Azure, no GCP. Drop us a line if that shapes whether you'd adopt; we're tracking demand.
- Terraform / HCL only. No CloudFormation, CDK, or Pulumi yet.
- Up to 100 changed files per PR. Larger PRs read the first 100. If you regularly exceed that, ping us.
- Public beta. Things break. Mail us if a finding looks wrong; we tune the rule catalog from real PR feedback.