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

  1. Fork the repository
  2. Create your feature branch from main
  3. Make your changes with tests/docs as appropriate
  4. Run test suites and ensure code compiles:
    cargo test --workspace
    bun run tauri build
  5. 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 in src/services/
  • Styling: Tailwind CSS 4 utility classes and CSS variables
  • Types: All shared types live in src/types.ts and @veyak-internal/models (generated from crates/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)] from ts-rs
  • HTTP client: reqwest 0.13 with Tokio async runtime
  • gRPC: veyak-grpc with HTTP/2 transport and reflection
  • Serialization: serde + serde_json + serde_yaml
  • Error handling: thiserror via veyak-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)

Open a bug report →


Code of Conduct

Be respectful and constructive. We’re all here to build something great together.


Author

Hrithik Dhakrey (@iamdhakrey)