Built in Rust, powered by Orchard
A fast Java linter with auto-fix support
lintal reads your existing checkstyle.xml configuration and can automatically fix many violations that checkstyle can only detect. Built for AI coding workflows where formatting matters.
$
Features
Everything you need to keep your Java code clean
lintal combines the familiarity of checkstyle configuration with the speed of native compilation and the power of automatic fixes.
5-8x Faster
Native binary with no JVM startup overhead. Parallel file processing utilizes all CPU cores for maximum throughput.
Auto-Fix Support
Automatically fix whitespace, brace placement, modifier order, unused imports, and more. No more manual formatting.
See examplesCheckstyle Compatible
Reads your existing checkstyle.xml configuration. All 86 implemented rules validated against checkstyle's own test suite.
Performance
Significantly faster than checkstyle
Benchmarked against Checkstyle 13.2.0 with 48 of lintal's 86 supported rules including Indentation and Naming. 10 runs each after warmup.
Agrona289 files
8.1x fasterCheckstyle
1.60s
lintal
0.20s
Artio726 files
6.8x fasterCheckstyle
2.77s
lintal
0.41s
Aeron®935 files
5.5x fasterCheckstyle
4.97s
lintal
0.90s
Checkstyle
lintal
Run benchmarks yourself:
mise run benchmark86 Rules
Targeting 100% checkstyle compatibility
All rules are validated against checkstyle's own test suite and achieve zero false positives on real-world projects.
Safe auto-fix
Unsafe fix (--unsafe-fixes)
Whitespace (16)
- WhitespaceAround
- WhitespaceAfter
- NoWhitespaceAfter
- NoWhitespaceBefore
- SingleSpaceSeparator
- ParenPad
- TypecastParenPad
- MethodParamPad
- EmptyForInitializerPad
- FileTabCharacter
- GenericWhitespace
- OperatorWrap
- EmptyLineSeparator
- Indentation
- NoLineWrap
- SeparatorWrap
Blocks (6)
- LeftCurly
- RightCurly
- NeedBraces
- EmptyBlock
- EmptyCatchBlock
- AvoidNestedBlocks
Modifiers (5)
- ModifierOrder
- RedundantModifier
- FinalParameters
- FinalLocalVariable
- FinalClass
Coding (20)
- CovariantEquals
- DeclarationOrder
- DefaultComesLast
- EmptyStatement
- EqualsHashCode
- FallThrough
- HiddenField
- IllegalCatch
- IllegalThrows
- IllegalType
- InnerAssignment
- MissingSwitchDefault
- MultipleVariableDeclarations
- NestedTryDepth
- OneStatementPerLine
- PackageDeclaration
- SimplifyBooleanExpression
- SimplifyBooleanReturn
- StringLiteralEquality
- UnnecessaryParentheses
Naming (9)
- ConstantName
- TypeName
- MethodName
- MemberName
- ParameterName
- LocalVariableName
- LocalFinalVariableName
- StaticVariableName
- PackageName
Imports (5)
- AvoidStarImport
- IllegalImport
- ImportOrder
- UnusedImports
- RedundantImport
Javadoc (7)
- JavadocMethod
- JavadocStyle
- JavadocType
- JavadocVariable
- MissingJavadocMethod
- MissingJavadocType
- MissingJavadocPackage
Design (4)
- HideUtilityClassConstructor
- MutableException
- OneTopLevelClass
- VisibilityModifier
Sizes (4)
- FileLength
- LineLength
- MethodLength
- ParameterNumber
Regexp (3)
- Regexp
- RegexpHeader
- RegexpSinglelineJava
Miscellaneous (5)
- UpperEll
- ArrayTypeStyle
- NewlineAtEndOfFile
- DescendantToken
- TodoComment
Annotation (1)
- MissingOverride
Metrics (1)
- CyclomaticComplexity
Installation
Get started in seconds
lintal supports macOS and Linux. Choose your preferred installation method.
Homebrew
$
mise
$
Build from source
$
Usage
Simple, familiar commands
Check files for violations
$
Fix violations automatically
$
Use a specific config
$
Preview fixes without applying
$
Apply unsafe fixes (e.g. stub javadoc)
$
Questions & Answers
Ready to speed up your Java linting?
lintal is open source under the MIT license. Star us on GitHub or report issues.