Development setup
Requirements:- Python 3.11+
- uv (recommended) or pip
- Docker (for integration tests)
- Ollama (optional, for persona generation)
- uv (recommended)
- pip
Code style
- Python 3.11+ -modern syntax (
|unions,matchstatements) - Type hints everywhere -all function signatures, return types, class attributes
- Ruff for linting and formatting (line length 100)
- mypy in strict mode
- Google-style docstrings on all public functions and classes
Making changes
Write code
Follow the code style above. Key principles:
- No TODOs in code -future work goes in ROADMAP.md or GitHub issues
- Tests for every change
- Never execute user-supplied code (see threat model)
Areas for contribution
| Area | Examples |
|---|---|
| Persona packs | New industry themes (e-commerce, IoT, gaming, government) |
| Trap types | GraphQL, gRPC, WebSocket, SSH |
| Fingerprinting signals | New detection heuristics |
| Research | Deploy Sundew and share anonymized findings |
Adding a persona pack
Persona packs let Sundew run without an LLM. Create a JSON file insrc/sundew/persona/packs/:
- Realistic company name and industry context
- At least 5 REST endpoints with varied response structures
- MCP tools matching the industry theme
- Realistic fake data (valid UUIDs, plausible emails, real timestamps)
- Error responses matching the persona’s error style
Adding a trap type
Create a module insrc/sundew/traps/:
- Every trap must read from the persona -no hardcoded responses
- Every request must be recorded via
FingerprintCollector - No LLM calls at runtime
- No execution of user-supplied input
Questions?
- GitHub Discussions
- Documentation
- Check existing issues before filing new ones