-
Notifications
You must be signed in to change notification settings - Fork 57
Contributing
Anes Berbic edited this page Mar 13, 2026
·
1 revision
Thank you for your interest in contributing to ApiArk! This guide will help you get set up and make your first contribution.
Be respectful. Be constructive. We're all here to build great software.
| Tool | Version | Purpose |
|---|---|---|
| Node.js | 22+ | Frontend build |
| pnpm | 10+ | Package manager |
| Rust | Latest stable | Backend |
| Git | 2.x+ | Version control |
# 1. Fork and clone
git clone https://github.com/YOUR_USERNAME/apiark.git
cd apiark
# 2. Install dependencies
pnpm install
# 3. Install Linux dependencies (Ubuntu/Debian only)
sudo apt install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libssl-dev
# 4. Start development mode
pnpm devThis launches:
- Vite dev server (hot-reload for frontend)
- Tauri dev process (rebuilds Rust on changes)
- Opens the app window
apiark/
├── apps/
│ ├── desktop/ # Tauri desktop app
│ │ ├── src/ # React frontend
│ │ │ ├── components/ # UI components
│ │ │ ├── stores/ # Zustand state stores
│ │ │ ├── hooks/ # Custom React hooks
│ │ │ ├── lib/ # Utility functions
│ │ │ ├── types/ # TypeScript types
│ │ │ └── locales/ # i18n translations
│ │ └── src-tauri/ # Rust backend
│ │ └── src/
│ │ ├── commands/ # Tauri IPC handlers
│ │ ├── http/ # HTTP engine
│ │ ├── storage/ # File system + SQLite
│ │ └── models/ # Data models
│ └── cli/ # CLI tool (Rust)
└── packages/
├── types/ # Shared TypeScript types
└── importer/ # Collection importers
- Search existing issues to avoid duplicates
- Open a new issue with:
- OS and version
- ApiArk version
- Steps to reproduce
- Expected vs actual behavior
- Logs from
~/.apiark/logs/apiark.log(if relevant)
- Check Discussions — your idea might already be proposed
- Open a Discussion (not an Issue) with:
- The problem you're trying to solve
- Your proposed solution
- Alternatives you've considered
-
Find an issue: Look for
good first issueorhelp wantedlabels - Comment: Let us know you're working on it
-
Branch: Create a branch from
main:git checkout -b feat/my-feature - Code: Make your changes
- Test: Ensure everything works
- PR: Open a pull request
- Format with
rustfmt(default settings) - Lint with
clippyatwarnlevel - Use
thiserrorfor typed errors,anyhowat application boundary - All Tauri commands return
Result<T, String> - Async by default (tokio)
// Good
#[tauri::command]
async fn get_users(state: State<'_, AppState>) -> Result<Vec<User>, String> {
state.storage.get_users().await.map_err(|e| e.to_string())
}
// Bad — synchronous, unwrap
#[tauri::command]
fn get_users(state: State<'_, AppState>) -> Vec<User> {
state.storage.get_users().unwrap()
}- ESLint + Prettier for formatting
- Functional components only
- Zustand for state management
- No
anyunless absolutely necessary - File naming:
kebab-case.tsxfor components,camelCase.tsfor utilities - Component naming: PascalCase, one component per file
// Good
export function RequestBuilder({ request, onSend }: RequestBuilderProps) {
const { activeEnvironment } = useEnvironmentStore();
// ...
}
// Bad — class component, inline styles, any
export class RequestBuilder extends React.Component<any> {
render() {
return <div style={{color: 'red'}}>...</div>
}
}Branch naming:
-
feat/description— New features -
fix/description— Bug fixes -
refactor/description— Code refactoring -
docs/description— Documentation
Commit messages (Conventional Commits):
feat: add GraphQL schema explorer
fix: resolve WebSocket connection cleanup
refactor: extract auth module from http client
docs: add contributing guide
test: add collection runner tests
chore: bump dependencies
- Title: Short, descriptive (e.g., "feat: add gRPC server reflection support")
- Description: What changed and why. Link the issue it addresses
- Size: Keep PRs small and focused. One feature/fix per PR
- Tests: Add tests for new functionality
- No breaking changes without discussion first
- CI must pass: All checks must be green
## Summary
Brief description of what this PR does.
## Changes
- Added X
- Fixed Y
- Refactored Z
## Test Plan
- [ ] Tested manually on [OS]
- [ ] Added unit tests
- [ ] Existing tests pass
Closes #123Help translate ApiArk to your language:
- Copy
apps/desktop/src/locales/en.json - Create
apps/desktop/src/locales/{language-code}.json - Translate all strings
- Open a PR
Current translations: English, Spanish, French, German, Portuguese, Chinese, Japanese, Korean, Arabic.
Frontend (React + TypeScript)
│
│ Tauri IPC (invoke commands)
│
Backend (Rust)
├── HTTP Engine (reqwest)
├── File System (tokio fs)
├── Script Engine (rquickjs)
├── Mock Server (axum)
├── gRPC Client (tonic)
├── WebSocket Client (tokio-tungstenite)
└── Database (rusqlite/SQLite)
Key design decisions:
- Tauri v2: Native performance, small binary, OS-level webview
- Zustand: Simple state management without boilerplate
- YAML on filesystem: Git-native, no migration headaches
- SQLite: Only for ephemeral data (history, monitors) — never for user collections
- GitHub Discussions — Ask questions
- Discord — Real-time chat with the team
- Read
CLAUDE.mdin the repo root — comprehensive technical documentation
ApiArk — No login. No cloud. No bloat. | Website | GitHub | MIT License
Getting Started
Core Features
Advanced Features
Tools
Resources