Contributing
Contributions are welcome! Veyak is open source and built with the community in mind. Whether you’re fixing a typo, reporting a bug, or building a new feature — all contributions are appreciated.
Ways to Contribute
- 🐛 Bug Reports — Found something broken? Open an issue
- 💡 Feature Requests — Have an idea? Share it in GitHub Discussions
- 📝 Documentation — Improve or expand these docs
- 🔧 Code — Fix a bug or implement a feature
Development Setup
Prerequisites
| Tool | Version |
|---|---|
| Node.js | 18+ |
| Bun | Latest |
| Rust | 1.70+ |
| Xcode CLT (macOS) | Latest |
Setup
# Clone the repo
git clone https://github.com/iamdhakrey/veyak.git
cd veyak
# Install JS dependencies
bun install
# Start in development mode
bun run tauri dev
The app opens automatically after the Vite dev server starts.
Project Structure
veyak/
├── crates/ # Modular Rust Cargo workspace crates
│ ├── veyak-models/ # Domain data models & ts-rs bindings generator
│ ├── veyak-grpc/ # gRPC client, reflection, dynamic protobuf codec
│ ├── veyak-auth/ # PKCE OAuth flow & token management
│ ├── veyak-db/ # YAML persistence layer
│ └── veyak-error/ # Shared typed AppResult and AppError
├── src/ # React 19 frontend
│ ├── components/ # UI components
│ │ ├── RequestEditor/ # URL bar, params, headers, cookies, auth, body
│ │ ├── ResponsePanel/ # Status, headers, cookies, body viewer
│ │ ├── Sidebar/ # Workspaces, collections, history
│ │ ├── gRPC/ # gRPC address bar, reflection, service picker, panels
│ │ └── WebSocketPanel/ # WS connection UI & log
│ ├── hooks/ # Custom React hooks (auto-updater, shortcuts)
│ ├── services/ # Tauri invoke wrappers
│ ├── store/ # Zustand state stores (varta, workspace, setting, auth)
│ └── types.ts # Shared TypeScript types
├── src-tauri/ # Tauri 2 desktop harness
│ ├── src/
│ │ ├── commands/ # Tauri IPC command handlers
│ │ ├── http.rs # Reqwest async HTTP client
│ │ ├── ws.rs # Tokio-tungstenite WebSocket client
│ │ └── lib.rs # Tauri app setup & command registration
│ └── Cargo.toml # Desktop dependencies & capabilities
└── Cargo.toml # Cargo workspace definition
Contribution Guidelines
Branching
# Create a feature branch
git checkout -b feature/my-new-feature
# Or a bugfix branch
git checkout -b fix/issue-123
Commit Style
Use conventional commits:
feat: add timeout configuration to settings panel
fix: resolve crash when sending request with empty URL
docs: add keyboard shortcuts reference
chore: bump reqwest to 0.13.4
Pull Request Process
- Fork the repository
- Create your feature branch from
main - Make your changes with tests/docs as appropriate
- Run test suites and ensure code compiles:
cargo test --workspace bun run tauri build - Submit a PR with a clear description of the changes
Frontend Tech Notes
- State management: Use Zustand stores in
src/store/ - Tauri calls: All Rust commands go through
invoke()— wrap them insrc/services/ - Styling: Tailwind CSS 4 utility classes and CSS variables
- Types: All shared types live in
src/types.tsand@veyak-internal/models(generated fromcrates/veyak-models)
Backend Tech Notes
- Rust edition: 2021 (Cargo workspace)
- Modular crates: Keep domain logic inside appropriate
crates/veyak-*crates - Type bindings: When modifying data structures in
veyak-models, export TypeScript interfaces using#[derive(TS)]fromts-rs - HTTP client:
reqwest0.13 with Tokio async runtime - gRPC:
veyak-grpcwith HTTP/2 transport and reflection - Serialization:
serde+serde_json+serde_yaml - Error handling:
thiserrorviaveyak-error
Reporting Bugs
Please include:
- Veyak version
- OS and version
- Steps to reproduce
- Expected vs actual behavior
- Logs (if relevant — check the Tauri dev console)
Code of Conduct
Be respectful and constructive. We’re all here to build something great together.
Author
Hrithik Dhakrey (@iamdhakrey)