By contributing to Vibra Code, you agree that your contributions will be licensed under the AGPL-3.0 License. If your employer has rights to code you write, make sure you have permission to contribute under AGPL-3.0 before opening a PR.
Prerequisites
Before you begin, make sure you have the following installed:| Requirement | Version | Purpose |
|---|---|---|
| Node.js | 20+ | Backend runtime |
| Yarn | any | Mobile app dependency management |
| Xcode | 16+ | iOS simulator and native builds |
| CocoaPods | latest | iOS native dependency management |
| Git | any | Version control |
Contribution workflow
Fork and clone the repository
Fork the repository on GitHub, then clone your fork with submodules:Create a feature branch from
main:Set up the backend
.env.local:Set up the mobile app
ios/Exponent.xcworkspace in Xcode. In EXBuildConstants.plist, set DEV_KERNEL_SOURCE to LOCAL. Build and run to a simulator or device.Make your changes
Work on your feature or fix. Follow the code style guidelines below. Write focused commits with clear messages:
Open a pull request
Push your branch and open a PR against
main on the upstream repository. Your PR description should include:- A clear title describing the change
- What changed and why
- Screenshots or screen recordings for any UI changes
- A link to the related issue, if applicable
Code style guide
TypeScript (backend and React Native)
Use TypeScript for all new backend and React Native code. Follow the patterns already established in the codebase:- Backend (Next.js): Convex functions follow the schema patterns in
convex/schema.ts. Inngest functions handle background processing and live inlib/inngest/functions/. API routes use Next.js App Router conventions. - React Native: Components live in
src/screens/(screens) andsrc/services/(business logic). Use the same import aliases and hook patterns as existing files. - Convex schema is shared between the mobile app and backend via a symlink — do not duplicate it.
Objective-C (iOS native Menu system)
The native iOS chat UI inapps/expo-go/ios/Client/Menu/ is written in Objective-C and must stay that way. Key rules:
- All chat cell nodes extend
ASCellNode(Texture/AsyncDisplayKit) - Layout uses
ASLayoutSpec, not Auto Layout - Image loading uses SDWebImage
- Animations use spring timing:
UIView.animate(springDuration:) - Target iOS 26+ with modern APIs (prefer
UIGlassEffectoverUIBlurEffect, etc.)
PR guidelines
- Keep PRs focused. One concern per PR. A PR that fixes a bug should not also refactor unrelated code.
- No mixed refactors. If you want to refactor something while fixing a bug, open a separate PR for the refactor.
- Update documentation. If your change affects user-facing behavior, update the relevant docs page.
- Add tests for new functionality. If you add a new function or feature, include test coverage.