Thanks for considering contributing to Faze! We're building a local-first observability tool that's actually pleasant to use, and we'd love your help.
You'll need:
- Rust 1.91 or later
- Protobuf compiler (
protoc) - Bun (for the UI - install from bun.sh)
The easiest way to get everything set up is with Nix:
nix developThis drops you into a shell with all the dependencies ready to go.
# Clone the repo
git clone https://github.com/ErickJ3/faze
cd faze
# Build everything
cargo build
# Or use just for convenience
just buildFaze is split into several crates:
faze- Core library with storage and modelsfaze-collector- OTLP protocol implementation (gRPC and HTTP)faze-server- Web server and APIfaze-cli- Command-line interfacefaze-tui- Terminal UI (work in progress)ui/- React-based web interface
The quickest way to test your changes:
# Start the server with hot reload
just dev-server
# Or run the full stack (server + UI)
just devThe server will be at http://localhost:7070 and the OTLP collector at ports 4317 (gRPC) and 4318 (HTTP).
-
Create a branch - Branch off from
main:git checkout -b your-feature-name
-
Make your changes - Write code, fix bugs, add features. Keep commits focused and atomic.
-
Test your changes:
# Run all tests (Rust + UI) cargo test --workspace cd ui && bun run test # or just test # For UI tests with interactive interface just test-ui # For UI tests with coverage just test-ui-coverage
-
Check code quality:
# Format code cargo fmt --all # Run clippy cargo clippy --workspace --all-targets # Or run both just check
-
Commit - Write clear commit messages that explain what and why:
feat: add filtering by service name to traces endpoint Users can now filter traces by service name using the ?service=name query parameter. This makes it easier to debug specific services.
- Push your branch to your fork
- Open a PR against
main - Fill in the PR template (if we have one)
- Wait for CI to run - it checks formatting, linting, and tests
- Address any review comments
We'll try to review PRs quickly, but keep in mind this is a side project and response times might vary.
Look for issues tagged with good first issue. These are usually:
- Small, well-defined tasks
- Good for getting familiar with the codebase
- Have clear acceptance criteria
Here are some areas where we'd love help:
Features:
- Improve HTTP OTLP support (it's partial right now)
- Add metrics visualization
- Implement log filtering and search
- Better error handling and user feedback
- TUI implementation
Performance:
- Query optimization
- Better indexing strategies
- Reduce memory usage for large traces
Developer Experience:
- Better documentation
- More examples
- Integration guides for common frameworks
UI/UX:
- Make the web UI prettier and more intuitive
- Better mobile support
- Dark mode improvements
Don't see something you want to work on? Open an issue to discuss it first.
- Follow standard Rust conventions
- Use
cargo fmtfor formatting - Keep clippy happy (we run with
-D warnings) - Write tests for new functionality
- Add doc comments for public APIs
We're not super strict, but try to:
- Keep functions focused and small
- Avoid unnecessary complexity
- Prefer readability over cleverness
- Use meaningful variable names
For the UI:
- Use TypeScript, not JavaScript
- Follow the existing component structure
- Keep components small and focused
- Use Tailwind for styling
We don't enforce a strict format, but good commit messages help:
type: brief summary (50 chars or less)
More detailed explanation if needed. Wrap at 72 characters.
Explain the problem you're solving and why you chose this approach.
Fixes #123
Types: feat, fix, refactor, docs, test, chore
# All tests (Rust + UI)
just test
# Only Rust tests
cargo test --workspace
# Specific Rust package
cargo test -p faze-collector
# With output
cargo test -- --nocapture
# UI tests only
cd ui && bun run test
# UI tests with interactive UI
just test-ui
# UI tests with coverage
just test-ui-coverageRust tests:
- Add unit tests in the same file as the code (
#[cfg(test)]modules) - Add integration tests in
tests/directories - Test happy paths and error cases
- Keep tests fast and deterministic
Example:
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_span_creation() {
let span = Span::new("test-span", "trace-123", "span-456");
assert_eq!(span.name, "test-span");
}
}UI tests:
We use Vitest with React Testing Library. Place tests next to your components:
// MyComponent.test.tsx
import { render, screen } from '@testing-library/react'
import { describe, it, expect } from 'vitest'
import { MyComponent } from './MyComponent'
describe('MyComponent', () => {
it('renders the title', () => {
render(<MyComponent title="Hello" />)
expect(screen.getByText('Hello')).toBeInTheDocument()
})
})Tips for UI tests:
- Test user interactions, not implementation details
- Use
screen.getByRoleandscreen.getByLabelTextwhen possible - Mock API calls to keep tests fast
- Use
just test-uifor the interactive interface while developing
If you're modifying the database schema:
- Update
faze/src/storage/schema.rs - Consider migration impact (we don't have migrations yet, but we should)
- Update tests
- Document breaking changes
When working on the collector:
- Follow the OTLP specification
- Test with real OTLP clients when possible
- Both gRPC and HTTP should behave the same way
Stuck? Have questions?
- Open a discussion on GitHub
- Ask in issues (even if you're not reporting a bug)
- Tag maintainers if you need specific help
We're happy to help and answer questions. There are no stupid questions.
Be nice. That's it.
More specifically:
- Be respectful and inclusive
- Welcome newcomers
- Focus on the code, not the person
- Assume good intentions
We want Faze to be a welcoming project where everyone feels comfortable contributing.
By contributing to Faze, you agree that your contributions will be licensed under both MIT and Apache-2.0 licenses, matching the project's license.