Welcome! We're excited to have you contribute.
- Fork the repository
- Clone your fork:
git clone https://github.com/YOUR_USERNAME/veridion.git - Install dependencies:
pnpm install - Set up Docker services:
docker compose up -d postgres redis - Run migrations:
pnpm db:migrate - Start dev:
pnpm dev
Use conventional branch names:
feat/descriptionfor featuresfix/descriptionfor bug fixesdocs/descriptionfor documentationrefactor/descriptionfor refactoring
We use Conventional Commits:
feat(scanner): add reentrancy detection plugin
fix(api): handle null findings in audit response
docs(readme): update quick start section
- Create a PR against
main - Fill out the PR template
- Ensure CI passes (lint, typecheck, test, build)
- Request review from a maintainer
- TypeScript strict mode everywhere
- No
anytypes (enforced by ESLint) - Use
constassertions and branded types where appropriate - Follow existing patterns in the codebase
- Write tests for new features
- Aim for 80%+ coverage
- Frontend: Vitest + Playwright
- Backend: Jest
- Contracts: Soroban test framework
# Run all tests
pnpm test
# Run tests for a specific package
pnpm turbo test --filter=@veridion/scanner-core
# Run with coverage
pnpm test:coveragePlugins are the core of Veridion's extensible security scanning. Each plugin detects a specific vulnerability pattern and is completely independent of the scanner engine — no changes to scanner-core are required!
- Create a new directory:
plugins/my-vuln/ - Add
package.json,tsconfig.json,vitest.config.ts, and.eslintrc.js - Implement the
IRulePlugininterface from@veridion/scanner-types - Write comprehensive unit tests (aim for 80%+ coverage)
- Register your plugin in the API's plugin registry
- Run
pnpm test --filter=@veridion/plugin-my-vulnto verify
- Plugin Development Guide — Complete reference for
IRulePlugin,PluginMetadata,AnalysisContext,FindingResult, best practices, and testing - Plugin Example Walkthrough — Step-by-step tutorial building a Self-Destruct Detection Plugin from scratch
- Plugin must implement the
IRulePlugininterface - Plugin must include unit tests covering positive cases, negative cases, and edge cases
- Plugin metadata must be complete (id, name, version, description, severity, category, chains, languages, tags)
- Confidence scores must be accurate (0.9+ for definite detections, 0.5-0.7 for heuristics)
- No dependencies on
scanner-coreor backend packages — only@veridion/scanner-types,@veridion/shared, and optionally@veridion/logger - Follow the naming conventions: kebab-case ID, PascalCase class name with
Pluginsuffix
@veridion/shared- No backend/frontend-specific code@veridion/scanner-types- Only interfaces, no implementation@veridion/database- Only Prisma schema and client exports- Plugins - Only depend on
@veridion/scanner-types
See CODE_OF_CONDUCT.md.