driftlog
import { db } from '../db/client'controller.save(user)await queryBuilder.raw(sql)Widget build(BuildContext ctx)import 'package:db/queries.dart'return res.json(await db.find())setState(() => _data = raw)ctx.db.users.findMany()

// open beta driftlog v1.0

Your architecture is drifting
right now.
You just cannot see it.

Driftlog watches your codebase for architectural violations like layer breaches, forbidden imports, and boundary crossings, then flags them before they ship.

connect your repo
terminal

// how it works

From push to protected in three steps

Driftlog fits into your existing workflow. Define rules, push code, and get instant feedback on architectural violations.

01

Define your rules

Write simple YAML rules that describe your architecture: which layers can import from where, which modules stay isolated, and which patterns are banned.

02

Driftlog parses your code

Using tree-sitter, Driftlog builds an AST of every file and checks it against your rules. No runtime overhead, no instrumentation required.

03

Get violations in your PR

Driftlog comments directly on your pull request with clear, actionable violations. No dashboard tab-switching. Fix it where you see it.

// pr integration

Your PR already knows what broke

Driftlog posts a comment on every pull request with a clear summary of architectural violations. No context-switching to another dashboard. Review and fix inline.

supports typescript · javascript · dart · go · python

DL
driftlogbot
just now

Found 2 errors and 1 warning

src/controllers/auth.ts:89

controller imports from src/db

rule: no-db-in-controllers

The AuthController at line 89 directly imports DatabaseClient from the data layer. Controllers should use service classes to access data. Move the query logic to AuthService and inject it instead.

lib/payment/checkout.dart:34

payment internals exposed

rule: payment-isolation

checkout.dart exports the internal PaymentGateway class, which breaks the payment module boundary. Only the public PaymentService API should be accessible from outside lib/payment/.

src/components/Profile.tsx:12

ui calls api layer directly

rule: ui-no-direct-api

Profile.tsx calls fetchUserData() from the api layer directly. UI components should use hooks or a state management layer to access data, not call API functions directly.

// by the numbers

Zero config. Five minutes. Done.

Driftlog is zero-config by default. Install, scan, and get results in under five minutes.

<5min

average setup time from install to first scan

0

built-in architectural rules across five languages

0

runtime dependencies, pure static analysis

// pricing

Pay for what ships, not what sits

Start free. Upgrade when your team needs custom rules, tracking, and integrations.

Hobby

$0

free forever
  • +1 repository
  • +6 built-in rules
  • +GitHub PR comments
  • +Community support
get started
Team

$18

per seat / mo
  • +Unlimited repositories
  • +40+ rules + custom rules
  • +GitHub & GitLab integration
  • +Drift score tracking
  • +Slack notifications
  • +Priority support
start free trial
Business

$38

per seat / mo
  • +Everything in Team
  • +SSO / SAML
  • +Audit log
  • +Custom integrations
  • +Dedicated support
  • +SLA guarantee
contact sales

One command. Architecture on autopilot.

Set up Driftlog in under five minutes. One command, zero config, and your architecture has a guardrail.

$
get started for free