Semfora - Semfora helps you to see how your code changes over time.  | Product HuntOntologies are hereGet started

AI made content cheap. Understanding stayed expensive.

Your team ships more than it did a year ago. The rules that keep the system coherent did not get written down, so a new hire cannot see them and a model cannot see them. Semfora writes them down as axioms the engine checks against your call graph, measures how each repository changes on every merge, and applies your policy to a pull request before it merges.
semfora · dashboard (example repo)names + numbers only · source never stored

Health score

78

+2 this month

Clarity

71

−1 this month

Stability

82

+3 this month

Structure

74

steady

Complexity trend · trailing 6 months

Risk hot-spots · complexity percentile in this repo

validateUser
p98
router.dispatch
p95
serializeReply
p93
syncInventory
p91

Hidden coupling

services/billing.ts ⇄ infra/queues.tf

Changed together in 41 of 43 commits. This PR touches only one of them.

3.63×

the concentration of real bug fixes inside the smaller review surface Semfora flags, versus an even spread

30.5%

of 1,773 real bug fixes fell inside a flagged surface covering just 8.4% of the code

410

public repositories across 8 languages in the study: real fixes, not synthetic benchmarks

Ontologies

The rules your senior engineers keep in their heads, written down once.

Every team has them. Admin tools never touch the ledger. Every payment endpoint goes through the audit log. They live in review comments and in documents nobody reads, so a new hire cannot see them and a model cannot see them. Both break them politely.

An axiom is a claim about your whole system that the code either upholds or breaks. A linter rule reads one file. A test pins one behavior somebody chose to write. An axiom follows call chains across the codebase and answers a different question: is it still true that nothing in admin code can reach the ledger?

The answer is the rule holds, or the exact chain of calls that breaks it. There is no score and no model in the loop.

Declare your axioms in a semfora-ontology.toml at the root of your repository. Every full analysis of your default branch then reports which of them hold and which are broken, with the call chain behind each break, on your dashboard.

Admin tools never reach the ledger.

A property of the whole system, followed across call chains no single file shows.

Database work stays in the server and the worker.

An effect boundary. It holds, or it names the symbol that crosses it.

Nothing in src writes to disk or opens a socket.

An effect rule. The graph either upholds it or names the symbol that breaks it.

Nobody writes these from a blank page

A blank rules editor asks you to do the hardest part first. Instead the engine reads your graph and proposes the rules your code already follows. A candidate with zero violations can be adopted without failing a pull request that passes today.

We ran that on ourselves before asking anyone else to. Semfora now declares its own axioms, every one of them mined from our code and adopted only because our code already followed it. Adopting them broke nothing, because there was nothing to break.

The miner also proposed rules our code did not yet follow. We left those out. A rule that already fails turns the board red on work that was fine yesterday, and that is a decision to make deliberately.

Where this actually is

Results come from a full analysis of your default branch. A pull request check reads your axioms too, but those findings describe that branch, so the page says so rather than presenting them as the repository's own. Adopting an axiom from the web, searching them, and having a broken axiom turn a pull request red are designed and not shipped. We would rather say that here than let you find it out after signing up.

The AI adoption curve

AI made your team faster. How long before the issues start?

Teams that adopt AI assistants typically ship more for the first six to twelve months. Then the curve turns, and it turns hard, because the codebase grew faster than anyone's understanding of it.

Months 0–6

The spike

Output climbs. AI writes the boilerplate, pull requests get bigger, and the velocity charts look better than they ever have. Clarity is the first thing to slip: nobody's understanding grows as fast as the diff.

Months 6–12

The drag

Complexity compounds quietly, and the code AI wrote this quarter starts colliding with the code AI wrote last quarter. Stability follows: reviews slow down and regressions climb.

After

The comprehension gap

Output declines sharply, and the engineers debugging production have read less of the code than any team before them. Incidents arrive in code nobody actually wrote, through dependencies nobody knew existed.

You can't manage what nobody understands. Semfora gives engineering managers and SREs a structural view of what AI is doing to the codebase measured on every merge, in numbers a director can put in a slide and an engineer can act on. Know how your codebase is being affected by leaning on AI, before the curve turns.

The fix is not slowing down. It's aiming. Your best engineers and your best models belong in the most dangerous parts of the codebase, not the safest. In our study, 30.5% of real bug fixes landed in 8.4% of the code. Semfora shows you which 8.4%. Send the senior reviewer and the frontier model there, and let the settings page make do with haiku.

Three surfaces. One map.

Connect a repo and Semfora indexes its structure and history on every merge. The dashboard, the AI chat, and the PR gate all answer from that same map, so the same question gets the same answer, with file and line attached.
1Your repo
your-repo/
src/
api/
lib/
services/
30 grammars
indexed on every merge
2The map
structure + history
12,800functions mapped
3,200call relationships
100%complexity scored
example repo · rebuilt on every merge
query
3Everything downstream

Dashboard

updated on every merge

Health, hotspots, and trends for every repo. Built for engineering leads.

AI chat

grounded in your metrics

Ask questions in plain English. Answers cite functions and numbers from your own analysis.

PR gate

same input, same verdict

Deterministic pass/fail on every pull request.

The merge control

Policy on every pull request, from a five-line workflow.

The dashboard shows engineering leaders where attention should concentrate. The gate is the other half of that loop: it applies your written policy to every pull request before merge, and records what the decision was based on.

.github/workflows/semfora-gate.yml

name: Semfora Gate
on:
  pull_request:
  pull_request_review:
    types: [submitted]  # re-run on approval (waiver flow)

jobs:
  gate:
    runs-on: ubuntu-latest
    steps:
      - uses: Semfora-AI/semfora-action@v2
        with:
          semfora-key: ${{ secrets.SEMFORA_KEY }}

semfora.toml · your policy, in your repo

[groups.billing]
description = "Money: plans, quotas, subscriptions"
files = ["src/server/billing*.ts"]

[gate.protected]      # touching money turns the PR red
severity = "error"
groups = ["billing", "auth-boundary"]

[gate.complexity]     # budgets per changed symbol
severity = "warn"
max_cc = 25
max_cc_delta = 10

Deterministic, not vibes

The gate is policy evaluation over measured structure: which domain the diff touches, how load-bearing the edited symbols are, what happened to complexity. Same change, same verdict, every run.

Nothing runs on your runner

The action is a thin client. Analysis runs in Semfora's pipeline through your existing GitHub App connection; no checkout, no binary, and the report contains symbol names and numbers only.

Blockable, and waivable

An error finding files a Changes Requested review naming the domain it hit. A qualified reviewer approving the current head commit waives it, so the policy is a checkpoint with an owner, not a wall.

We run this gate on our own repository. The first pull request it denied was ours: a change to our billing code turned the check red and filed the review automatically. The policy held, a reviewer approved the change on its merits, and it merged with the decision on record.

Why Semfora

Not another linter. Not another delivery dashboard.

Every tool in this market holds part of the picture: a structural graph with no history, or git history with no real graph. Semfora keeps a deep call graph and the full commit history in one index, and the metrics that matter most only exist at that intersection.

Rule-based quality scanners

Score each file in isolation, on a snapshot. They can tell you a function is complex, but not that it's load-bearing code the rest of the system depends on: the kind you review extra carefully before changing.

Git-mining behavioral tools

See which files change together, but hold no call graph, so they can't separate healthy collaboration from coupling that never appears in the code itself.

Architecture visualization tools

Hold a dependency graph but no history. They show today's structure with no idea where it's been or where it's heading.

Delivery analytics

DORA metrics are good numbers: cycle time, deployment frequency, PR throughput. But they measure how fast work moves, not what the work is doing to the system underneath. Different question, different number.

What you can only measure with both

These feed the scores at the top of every Semfora dashboard: health, clarity, stability, and structure. They're the numbers an engineering manager checks first.

Hidden coupling

Files that change together with no code connection between them: the invisible dependencies that make a “small” change break a feature nowhere near it. Semfora surfaces each pair by name and asks the question a linter can't: these two almost always change together, so why didn't they this time?

Risk concentration

How much complexity and change activity piles onto the code everything else depends on. Load-bearing code isn't bad; it just deserves more care than the rest. When complexity concentrates there, you're a single hero file away from an outage.

AI comprehension cost

How much context an AI assistant, or a new hire, needs to safely change each part of the system. The first codebase metric designed for teams where half the commits are machine-written.

Health with a direction

One score that blends where the codebase is with the direction your own commit history says it has been moving. No forecasts: these curves move slowly, which is exactly why the trend matters. Snapshots hide decay. Trajectories don't.

Measured, not promised

Every number below was measured on public open-source repos with a reproducible harness. When a claim doesn't survive measurement, we delete it.
3.63×

Bug-fix concentration. Real bug fixes landed inside the smaller high-risk surface Semfora flags at 3.63 times the rate an even spread would give. Measured on 1,773 resolvable bug cases.

30.5%

Fixes inside the flagged surface. 541 of 1,773 real bug fixes fell inside a flagged surface covering just 8.4% of the matched line mass. The broader high-risk band alone held 41.6% of fixes in 14.5% of the code.

410

Repositories studied. Public open-source repositories across 8 languages. Every case has a real fix commit and changed-line ground truth; no synthetic bugs.

137

Cases metered with live agents. We metered what AI agents actually spend to work against real code: 1,370 completed runs across five models. Token spend tracked the size and centrality of the change more than anything else we tested. The trend is loose (rank correlation tops out near 0.21) but consistent across models.

30

Grammars. TypeScript to Terraform to TLA+. Counted from the engine's own language table: 23 languages, the JSX and TSX variants, Markdown, and the config formats that wire a system together.

128 KB

Names and numbers only. The hard cap on what one analysis can store: function and module names, scores, and counts. No field in the schema can carry your source.

30 grammars, one engine

From TypeScript to Terraform, with framework-aware analysis that goes deeper on the stacks big teams actually run.
  • TypeScript
  • JavaScript
  • React
  • Python
  • Rust
  • Go
  • Java
  • Kotlin
  • C++
  • C
  • C#
  • Ruby
  • PHP
  • Swift
  • Scala
  • Bash
  • Vue
  • HTML
  • CSS
  • SCSS
  • Terraform
  • Dockerfile
  • Gradle
  • TLA+

That's 24 chips on the wall, counting React, which rides the JSX and TSX grammars. The engine's own language table has 30 entries: these 23 languages, the JSX and TSX variants, Markdown, and the four config formats that wire a system together (JSON, YAML, TOML, and XML). Config gets parsed and graphed like everything else; we just don't call it a language.

Framework-aware analysis

React

Components, hooks, context

Next.js

App Router, Pages, API routes

Vue

SFCs, Composition API

Angular

Components, services, decorators

Svelte

Components and entry points

Express

Routes, middleware detection

NestJS

Controllers, decorators, modules

Fastify

Routes and plugins

Also framework-aware for Remix, SolidJS, Hono, Koa, tRPC, and Redux. Stack detection recognizes hundreds of libraries across 12 package ecosystems, including 100+ database drivers, ORMs, and schema tools, so your data layer gets read and risk-scored like any other code.

From connect to first report in one merge

Semfora runs in our cloud. One ephemeral container per analysis: your source is checked out, measured, and deleted when the run ends. What we keep are names and numbers.
1

Connect GitHub

Pick your repos. Semfora gets read-only access through a GitHub App.

semfora.ai/signup
2

Every merge gets analyzed

An ephemeral container maps the code's structure and posts back metrics: names and numbers, never source.

status: INDEXING → READY
3

Ask it anything

The dashboard for your leads, the PR gate for CI, and an AI chat grounded in your own metrics.

chat: “what got riskier this week?”

Questions, answered straight

What exactly is Semfora?

A cloud code-intelligence platform for engineering teams. Connect a GitHub repo and Semfora compiles every merge into a structural map of your code: every function, what calls it, how complex it is, and how all of that has changed over time. Your dashboard reads that map, your team asks it questions in plain English, and your pull requests get gated against it, deterministically.

What happens to my source code?

Each analysis runs in its own ephemeral container: your repo is checked out, measured, and the workspace is deleted when the run ends. What we store are names and numbers: symbol names, module names, scores, and counts, capped at 128 KB per run. There is no field in our data model that can carry source text, snippets, or diffs. That's a schema constraint, not a policy promise.

How is this different from grep or embeddings?

Grep matches text and embeddings match vibes. Semfora parses your code, so it knows that validateUser calls db.query inside a try block, how complex that function is, and who else calls it. Answers are structural and deterministic: the same question always returns the same result, with file and line attached.

Can it really see where bugs will come from?

We measured where fixes land, across 1,773 real bug cases in 410 public repos. 30.5% of the fixes fell inside a flagged surface covering just 8.4% of the code: a 3.63× concentration over an even spread. That's what the dashboard's hotspot views are built on. It is not bug prediction; it tells you where review attention pays off, not which function breaks next.

How does my team actually use it?

Three surfaces, one map. Engineering leads get the dashboard: health, hotspots, and trends per repo, updated on every merge. Anyone can ask the AI chat questions like “what did this feature do to the codebase?” or “which hotspots changed this week?” and get answers that cite functions and numbers from your own analysis. And CI gets a PR gate that returns the same verdict for the same change, every time.

What do I get when I sign up?

The cloud platform: GitHub-connected analysis on every merge, the manager dashboard, the AI chat grounded on your metrics, and the PR gate for CI. The free tier needs no card. Early customers get direct access to the team and a real say in the roadmap.