Thanks for your interest in Stringy. This guide explains how to propose changes and what we expect for code quality.
- Search existing issues and pull requests before filing a new one.
- For bugs, open an issue with a clear reproduction and expected vs actual behavior.
- For new features or larger changes, open an issue first to discuss scope.
Stringy uses Rust 2024 (MSRV 1.91+, see rust-toolchain.toml). We also use just for common tasks.
Recommended workflow:
just setup(to install tools)just build(compiles a debug build)just test(runs tests)just lint(runs linters)
If you do not use just, the critical requirement is that:
cargo clippy -- -D warningspassescargo fmtproduces no changes
These rules are enforced by CI:
- No unsafe code (
#![forbid(unsafe_code)]) - Zero warnings (
clippy -D warnings) - ASCII only in code and documentation, unless explicitly working with Unicode handling
- Keep files under 500-600 lines; split when needed
- No blanket
#[allow]on modules or files - No async; this is a synchronous CLI tool
Use thiserror for structured errors and include context (offsets, section names, file paths) when relevant.
Module layout:
container/handles format detection and section analysisextraction/handles string extraction, filtering, and deduplicationclassification/handles semantic tagging and rankingoutput/handles output formatterstypes/contains core data structures and error types
Key patterns:
- Section weights: add new section weights in
container/*.rsusing existing match patterns. Higher weight means more likely to contain useful strings. - Semantic tags: add new Tag variants in
types/mod.rs, implement detection inclassification/, and update any tag merging logic if needed. - Deduplication: preserve all occurrences and merge tags across occurrences in
extraction/dedup.rs. - Public structs: keep public API structs non_exhaustive and provide explicit constructors.
- Imports: prefer
stringy::extractionorstringy::types. Do not import deeply nested paths.
- Add or update tests for behavior changes.
- Use insta snapshots for output verification when appropriate.
- Integration tests live in tests/ and fixtures in tests/fixtures/.
Run:
just test
- Keep PRs focused and small when possible.
- Include a clear description of the problem and the solution.
- Link related issues in the PR description.
- Update documentation when behavior changes.
All pull requests require review before merging. Reviewers check for:
- Correctness: Does the code do what it claims? Are edge cases handled?
- Safety: No unsafe code, proper bounds checking, no panics/unwraps in library code
- Tests: New functionality has tests, existing tests still pass
- Style: Follows project conventions, passes
cargo fmtandcargo clippy -- -D warnings - Documentation: Public APIs have rustdoc, AGENTS.md updated if architecture changes
CI must pass before merge. The merge queue requires quality, MSRV, test, cross-platform test, and coverage checks. Security audit and CodeQL run as additional CI jobs but are not currently merge-blocking.
This project requires all contributors to sign off on their commits, certifying that they have the right to submit the code under the project's license. This is enforced by the DCO GitHub App.
To sign off, add -s to your commit command:
git commit -s -m "feat: add new feature"This adds a Signed-off-by line to your commit message:
Signed-off-by: Your Name <your.email@example.com>
By signing off, you agree to the Developer Certificate of Origin.
Docs live under docs/ and project planning artifacts are in project_plan/. Update them when you change user-facing behavior.
If you believe you found a security issue, please do not open a public issue. See SECURITY.md for reporting instructions, scope, and our PGP key.
Stringy uses a maintainer-driven governance model. Decisions are made by the project maintainers through consensus on GitHub issues and pull requests.
| Role | Responsibilities | Current |
|---|---|---|
| Maintainer | Merge PRs, manage releases, set project direction, review security reports | @unclesp1d3r, @KryptoKat08 |
| Contributor | Submit issues, PRs, and participate in discussions | Anyone following this guide |
- Bug fixes and minor changes: Any maintainer can review and merge
- New features: Discussed in a GitHub issue before implementation; maintainer approval required
- Architecture changes: Require agreement from both maintainers
- Breaking API changes: Discussed in a GitHub issue with community input; require agreement from both maintainers
As the project grows, active contributors who demonstrate sustained, high-quality contributions and alignment with project goals may be invited to become maintainers.
This project includes Claude Code configuration in .claude/settings.json. These settings enable plugins that help maintain code quality and follow project conventions. If you use Claude Code, the configuration will be applied automatically.
If you are unsure where to start, open an issue with your question and we will point you in the right direction.