FSLint

High-performance F# linter based on syntactic analysis, providing real-time feedback in IDEs and seamless CI/CD integration.
The Problem
Your F# codebase grows. Style inconsistencies creep in. Code reviews catch formatting issues instead of logic bugs. CI pipelines slow down waiting for linters that need full semantic analysis.
The Solution
FSLint gives you real-time style enforcement without the wait. No dependency resolution. No type checking overhead. Just instant feedback on what matters.
What You Get
Zero Setup — Install and start linting. No config files required.
Instant Feedback — See violations as you open and save, not after you push.
CI/CD Native — File-level analysis works in any pipeline, any environment.
Precise Rules — Based on F# official guidelines and B2R2 F# conventions.
Quick Start
Visual Studio
Extensions → Manage Extensions → Search "FSLint"
VS Code
ext install B2R2.fslint
Command Line (CI/CD)
dotnet tool install --global B2R2.FSLint
fslint check ./src
Open any .fs file. Violations appear instantly with visual indicators.
Why Syntactic Analysis?
FSLint analyzes your code structure, not its semantics. This means:
- No waiting for type inference
- No dependency graph resolution
- Works on incomplete code
- Scales to massive codebases
Perfect for catching style violations the moment you write them.
Built by Security Researchers
Developed at KAIST SoftSec Lab for the B2R2 binary analysis platform — a project with 700,000+ lines of F# that demands both speed and precision.
Requirements
- .NET SDK 10.0+
- F# source files (
.fs)
Extension Settings
fslint.strict — Turn on strict mode (default: false)
fslint.enable — Toggle linting (default: true)
fslint.trace.server — Debug LSP communication
Configuration
FSLint respects .editorconfig settings in your workspace:
[*.fs]
max_line_length = 120 # Default: 80
Release Notes
1.1.5
- Fixed crashes on various expressions
- Fixed duplicate warnings
- Fixed a misleading line-ending message in the language server.
1.1.4
- Fixed colon-spacing checks for dotted typeAnnotations.
1.1.3
- Fixed a crash on type annotations with empty type arguments.
- Stopped emitting spurious warnings on
extern declarations.
- Improved the self-identifier warning to suggest
_ or this based on usage.
1.1.2
- Fixed deconstructive bindings.
- Upgraded package handling to suppress unnecessary warnings.
- Fixed whitespace checking inside function bodies.
- Added the --verbose option.
- Optimized per-file warning reporting for improved diagnostics.
1.1.1
- Update package dependencies
1.1.0
- Add Anonymous record pattern
1.0.7 - 1.0.9
- Add line break check to FunctionCall
- Remove warnings from multiline
- Add missing cases of AnonRecd
1.0.6
- Reduce false positives related to spacing rules across various contexts
- Improve detection of missing or incorrect spacing
1.0.5
1.0.4
- Relax Tuple Convention rules to better handle cases with inline and trailing comments
- Refactor duplicated functions to improve maintainability and reduce redundancy
1.0.3
- Relax Declaration and ArrayOrList rules
- Use ParsedInput instead of source-aware algorithm
1.0.2
- Linting is no longer performed in real time and is now executed on file save.
Contributing
Found an issue? Have a suggestion?
→ GitHub Issues
License
MIT — Free for commercial and open source use.
Stop debating style in code reviews. Enforce it automatically.