gitclash()

gitclash review-commits --clash --date=today

defeat your colleagues with good commits.

A model wrote 99% of it. Good — that is the job now. gitclash grades the careful craft, not the author, slop gets roasted. Who prompts the best code?

[ install on github ] Read-Only, never writes!

Just login, I already have an account

The gitclash contributors table for a single day. Anna Kowalski is graded [A-] 92 on three commits with the whole stack ticked; Joschka Brandt [B+] 87; Lena Bauer [D] 64 with two commits flagged; Tim Meier [D] 62 with two flagged, 550 lines added and most of the stack marked as gone around.
Six people, one table, nowhere to hide.

“It works” is the lowest bar there is

Generated code passes review because it runs. Nobody checks whether it was built or just produced. gitclash does.

  • #412 Fix coupon lookup on cart update [A-]

    +31 −12 3 files 2 changes requested merged 3 days later

  • #413 Refactor checkout + add reporting module [D ]

    +2,300 −418 22 files no comments merged 11 minutes later

Not anti-AI. Anti-slop. Use every model you like — you still shipped it.

What the grade is made of

Three pillars, blended. The model reads the diff, not the commit message.

grading

Qualityweight 55
Naming, structure, validation, authorisation, N+1 risks, test coverage.
Stack adherenceweight 30
Did the work use the stack the repository is actually built on — or go around it by hand?
Sizeweight 15
Files touched, cross-checked against line churn, because a reviewable commit is a virtue.

A pillar that does not apply is not a zero — its weight is redistributed. A README fix is never marked down for skipping the framework.

The grading follows the repo

gitclash reads your manifest, works out what the repository is, and grades against that stack’s own idioms. A Django commit is never marked down for not being Laravel.

detected stacks

Laravel TALLLaravel, Livewire, Tailwind, Alpine
Earns marks: Eloquent relations, form requests, one Livewire component per concern.
Marked down: Raw SQL in a controller, validation by hand, a <style> block, raw JS instead of Alpine.
Laravel + ReactLaravel with Inertia or a React front end
Earns marks: Inertia props off a thin controller, typed resources, shared layouts.
Marked down: A second fetch layer calling the route the page was already handed.
Next.jsReact on the Next.js App Router
Earns marks: Server components by default, route handlers, next/image.
Marked down: useEffect fetching what the server already had, ‘use client’ at the root.
NuxtVue on Nuxt, Composition API
Earns marks: <script setup>, useFetch, auto-imported composables.
Marked down: Options API in a new file, axios sitting next to useFetch.
SvelteKitSvelte on SvelteKit, file-based routing
Earns marks: load functions, form actions, state kept in the component that owns it.
Marked down: onMount fetching a page it could have loaded, a store invented for one prop.
AstroAstro, server-rendered with islands
Earns marks: Static by default, content collections, an island only where it clicks.
Marked down: client:load on the whole page, a framework shipped to render static markup.
Node / TypeScriptNode or browser TypeScript, no framework
Earns marks: Types narrowed at the edges, errors handled, standard library first.
Marked down: any and @ts-ignore to quiet the build, a helper that rewrites the standard library.
DjangoPython on Django, batteries included
Earns marks: Querysets with select_related, forms, migrations checked in.
Marked down: Raw cursor SQL, an N+1 in a template loop, a model changed without a migration.
FastAPIPython on FastAPI, typed end to end
Earns marks: Pydantic models in and out, dependencies injected, async all the way down.
Marked down: Bare dicts as responses, blocking I/O inside an async route.
Ruby on RailsRuby on Rails, convention over configuration
Earns marks: Scopes, strong parameters, includes, controllers that stay thin.
Marked down: find_by_sql, business logic in a view, a callback chain nobody can trace.
GoGo, standard library first
Earns marks: Errors wrapped and returned, context passed through, table-driven tests.
Marked down: An error assigned to _, panic used as control flow, an interface for one caller.
TerraformInfrastructure as code in HCL
Earns marks: Modules, variables, a plan that matches what is already in state.
Marked down: Hardcoded ids and secrets, a resource clicked in by hand and never imported.
Static HTML / CSSHand written HTML and CSS, no build step
Earns marks: Semantic elements, labelled controls, CSS left to cascade.
Marked down: Div soup, inline styles, ninety kilobytes of script for a dropdown.

Anything else is graded Generic — quality and docs only. The stack pillar is dropped rather than failed, and its weight moves to the pillars that do apply. Lock files, vendored directories and anything else the toolchain wrote are skipped before grading starts.

Achievements are the part people chase

Thirty-seven of them. They sit on your profile, outlive the day they were won, and the whole company sees who holds what.

trophy case

  • Top of Leaderboard Top of the sheet for one whole day. It resets at midnight.
  • Straight A A whole day at an A. Now do it twice.
  • Three Figures A hundred commits in. Nobody has audited how many said “wip”.
  • Se7en Seven days without a break. What’s in the box? More tickets.
  • Forrest Gump Thirty days without stopping. Nobody was chasing you.
  • I’ll Be Back Reverted a revert.

+ 16 hidden

You find out they exist by earning them.

notifications

Badges land on your phone via Pushover the moment they are earned.

certificates

Every badge has a public certificate page, one click to LinkedIn.

your clock

Timing badges read the author’s own timezone, not the server’s.

Reputation is company wide, not repo wide

One table per organisation, weighted by files changed. Moving between repos does not reset who you are.

standings

gitclash standings --range=week-37 --org=acme
# grade contributor commits the week stack rep
01 [A ] j.reuter 18 ▂▅█▃▆▂ [x][x][x][x] 2,140
02 [A-] m.okafor 11 ▃▆▄█▂▁▁ [x][x][~][x] 1,884
03 [B+] s.lindqvist 23 █▇▅▆█▄▂ [x][~][x][ ] 1,612
04 [C+] d.aydin 31 █▄█▇█▅▃ [x][x][~][!] 1,109
05 [D-] p.vermeulen 47 █████▆█ [!][ ][!][ ] 402

Forty-seven commits and last place. Volume was never the score.

Put it on the office monitor

One read-only link, no account needed. It shows the standings and a line about what each person last pushed — and none of the material that line was written from.

shared sheet · read only

[A-] anna.k One line, one locale, one test. Suspiciously professional.
[B+] joschka Validation done properly, then a country list typed out by hand.
[D ] tim.m 380 lines of jQuery to redo what a query scope already did.

shows

Grades, counts, streaks, badges, repository names.

never shows

Commit messages, shas, findings, review narrative. Rows do not open.

The link is the whole authorisation — 32 random characters, revoked or reissued in one click. Turn the roasts off and it is figures only.

Free while the beta is open

Every repository, everyone in the organisation, the whole product. No card, no seat count, no trial quietly running out on you.

plan

€0

open beta · whole organisation

  • Unlimited repositories and contributors
  • Every check and stack, on every commit
  • Achievements, certificates, notifications
  • Company standings and the read-only office link

It stays free for as long as the beta runs. If that changes it will be said here first, and nobody is charged without being asked.

Now go and challenge your organisation.

Install it, pick the repositories it may read, and let them fight it out: who prompts the best code, and who walks off with the badges. Commits are graded as they land. Nothing is ever written back to your repos.

[ install on github ] Contents: read · Metadata: read · that is all it asks for

Just login, I already have an account