π One-command HTTP API for code linting with 18+ production-ready linters
Quick Start β’ Live Demo β’ API Docs β’ Docker Hub
A production-ready HTTP API that wraps 18+ popular code linters (ESLint, Prettier, Pylint, gofmt, RuboCop, etc.) into a single Docker container. Start linting any codebase in under 10 seconds with a simple REST API.
# Start the API (takes ~10 seconds)
docker run -p 3000:3000 arcblock/super-linter-api:latest
# Lint JavaScript instantly
curl -X POST http://localhost:3000/eslint/json \
-d "console.log('Hello'); var unused = 42;"
- CI/CD Pipelines - Fast, reliable linting in containers
- Code Review Tools - Integrate linting into PR workflows
- Multi-language Projects - One API for JavaScript, Python, Go, Ruby, Docker, YAML, etc.
- Microservices - Centralized linting service for distributed teams
# Production-ready in 10 seconds
docker run -d -p 3000:3000 --name linter-api arcblock/super-linter-api:latest
# Test it works
curl http://localhost:3000/health
π Live Demo API - Test without installing
git clone https://github.com/arcblock/super-linter-api.git
cd super-linter-api && pnpm install && pnpm dev
curl -X POST http://localhost:3000/eslint/json \
-H "Content-Type: application/json" \
-d '{
"content": "const unused = 42; console.log(\"Hello World\");",
"filename": "demo.js"
}'
Response:
{
"success": true,
"execution_time_ms": 245,
"issues": [
{
"file": "demo.js",
"line": 1,
"rule": "no-unused-vars",
"severity": "error",
"message": "'unused' is assigned a value but never used."
}
]
}
curl -X POST http://localhost:3000/oxlint/json \
-d '{"content": "const unused = 42;", "filename": "test.js"}'
# β‘ Returns in ~150ms vs ~750ms for ESLint
Language | Linters | Status | Use Cases |
---|---|---|---|
JavaScript/TypeScript | ESLint, Oxlint, Biome, Prettier | β 5 available | Modern web development, React, Node.js |
Python | Pylint, Black, MyPy, isort, Flake8 | β 5 available | Django, FastAPI, data science, automation |
Go | gofmt, golangci-lint | β 2 available | Microservices, CLI tools, backend APIs |
Ruby | RuboCop | β 1 available | Rails apps, Ruby gems, web backends |
Shell | ShellCheck | β 1 available | DevOps scripts, automation, Docker builds |
Docker | Hadolint | β 1 available | Container best practices, security |
YAML | yamllint | β 1 available | Kubernetes, CI/CD configs, Ansible |
Markdown | markdownlint | β 1 available | Documentation, README files, blogs |
CSS | stylelint | β 1 available | Frontend styling, design systems |
π Total: 18/21 linters available β’ View complete table β
# Synchronous linting
POST /{linter}/{format} # Lint code instantly
POST /{linter}/{format}/async # Submit long-running job
GET /jobs/{job_id} # Check job status
# System endpoints
GET /health # System health
GET /linters # Available linters
# Plain text
curl -X POST http://localhost:3000/eslint/json -d "console.log('hello');"
# JSON with options
curl -X POST http://localhost:3000/eslint/json \
-H "Content-Type: application/json" \
-d '{
"content": "console.log(\"hello\");",
"options": {"timeout": 10000}
}'
# File upload (base64)
curl -X POST http://localhost:3000/eslint/json \
-d '{"archive": "<base64-tar-gz>", "options": {"validate_all": true}}'
json
- Structured issue data (recommended)text
- Plain text outputsarif
- Security analysis format
π Complete API Documentation β
Linter | Language | Speed | Best For |
---|---|---|---|
gofmt | Go | πππ Ultra-fast (50ms) | Go code formatting |
Biome | JS/TS | πππ Ultra-fast (200ms) | All-in-one formatting & linting |
Oxlint | JS/TS | πππ Ultra-fast (150ms) | Fast feedback, CI/CD |
isort | Python | πππ Ultra-fast (100ms) | Import organization |
RuboCop | Ruby | ππ Fast (1-3s) | Ruby style guide enforcement |
ESLint | JS/TS | π’ Slower (750ms) | Legacy projects, complex rules |
Pylint | Python | π’ Slower (2000ms) | Comprehensive analysis |
Tested on standard codebase (100 lines)
# Just run it - permissions are handled automatically!
docker run -d -p 3000:3000 -v "$(pwd)/data:/app/data" arcblock/super-linter-api:latest
That's it! The container automatically:
- Creates the data directory if it doesn't exist
- Fixes permissions automatically
- Falls back to temporary storage if needed
version: '3.8'
services:
super-linter-api:
image: arcblock/super-linter-api:latest
ports: ['3000:3000']
volumes: ['./data:/app/data'] # Persistent cache & jobs
restart: unless-stopped
environment:
- NODE_ENV=production
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:3000/health']
apiVersion: apps/v1
kind: Deployment
metadata:
name: super-linter-api
spec:
replicas: 3
template:
spec:
containers:
- name: api
image: arcblock/super-linter-api:latest
ports: [containerPort: 3000]
livenessProbe:
httpGet: { path: /health, port: 3000 }
π§ Complete deployment guide β
We welcome contributions! Here's how to get started:
# 1. Fork & clone
git clone https://github.com/yourusername/super-linter-api.git
# 2. Install dependencies
pnpm install
# 3. Start development server
pnpm dev
# 4. Run tests
pnpm test
π Contributing Guidelines β β’ π Report Issues β
Built on the shoulders of giants:
- Super-linter - Multi-language linter foundation
- ESLint, Prettier, Pylint - Individual linting tools
- Express.js & TypeScript - Web framework & language
MIT License - see LICENSE file.
β Star this repo if it helped you!
π Get Started β’ π Documentation β’ π¬ Discussions
Made with β€οΈ by the ArcBlock Team