Open an issue. Include steps to reproduce, expected vs actual behavior, and your environment (OS, Docker version, browser).
Open an issue with:
- What data source the plugin would query
- What node/edge types it would produce
- Whether it requires an API key
- Rate limits of the upstream API
- Fork the repo
- Create a branch from
main - Make your changes
- Run
npm run lintandnpm test - Open a PR against
main
Keep PRs focused. One feature or fix per PR.
Plugins live in apps/worker/src/plugins/. Each plugin exports a single object implementing the Plugin interface from @threadr/shared:
import type { Plugin } from '@threadr/shared'
export const myPlugin: Plugin = {
id: 'my-plugin',
name: 'My Plugin',
accepts: ['Email'],
requiresKey: false,
rateLimit: { requests: 10, windowMs: 60_000 },
async run(seed, keys) {
// query your data source
// return { nodes: [...], edges: [...] }
},
}Register it in apps/worker/src/scan.ts.
- TypeScript strict mode
- No
anytypes without justification - Prefer
constoverlet - Error handling: catch, log, return empty results (plugins should not crash scans)
If you find a security vulnerability, do not open a public issue. Email contact@giuseppegiona.com instead.