Welcome, and thank you for your interest in contributing to Trixty IDE! 🚀
Trixty is a modern, agentic, and highly extensible IDE built for the next generation of developers. We value your help in making it better, whether you're reporting a bug, suggesting a feature, or contributing code.
Important
By contributing to this project, you agree that your contributions will be licensed under the UnSetSoft Public License (UPL) 1.0.
Please be aware of the specific conditions of this license:
- Contributive Purpose: Modifications are only allowed for the purpose of contributing back to the original project.
- Non-Commercial: The software and its derivatives may not be used for commercial purposes.
- Non-Distribution: You may not distribute the original software or modified versions externally.
- Attribution: Original code must be credited, and the UPL license must be retained in all files.
Beyond writing code, there are many ways you can help:
If you have questions about how to use Trixty or how it works, please open a Discussion in the GitHub Discussions tab. This helps keep our issue tracker clean and makes the answers searchable for others.
If you've found a bug or have a feature request:
- Search the existing Issues to ensure it hasn't been reported yet.
- Use the Templates: We have specific templates for bugs, features, and documentation.
- Be Descriptive:
- Bugs: Include your OS, Trixty version, and clear steps to reproduce.
- Features: Explain the why behind your request and how it benefits the community.
Warning
For security vulnerabilities, please do not open a public issue. Follow the Security Policy instead.
If you're ready to dive into the code, follow these steps:
Ensure you have the following installed:
- Node.js (v24+) & pnpm (v9.15.0, pinned via
package.json#packageManager) - Rust & Cargo & Visual Studio Build Tools (on Windows)
- Ollama (for testing AI features)
- Fork the repository on GitHub.
- Clone your fork locally:
git clone https://github.com/YOUR_USERNAME/ide.git cd ide - Install dependencies:
pnpm install
Always create a descriptive branch for your work:
git checkout -b feature/my-cool-feature
# OR
git checkout -b fix/issue-123| Command | What it does |
|---|---|
pnpm desktop |
Runs the desktop app in development mode (syncs version first) |
pnpm build |
Runs the Turborepo build pipeline |
pnpm version:sync |
Propagates the apps/desktop/package.json version to Cargo.toml and tauri.conf.json |
pnpm --filter @trixty/desktop lint |
Runs ESLint on the frontend |
pnpm --filter @trixty/desktop exec tsc --noEmit |
Type-checks the frontend without emitting files |
cargo clippy --manifest-path apps/desktop/src-tauri/Cargo.toml |
Runs clippy on the Rust backend |
cargo fmt --manifest-path apps/desktop/src-tauri/Cargo.toml |
Formats the Rust backend |
- Verify your changes: Ensure the app builds (
pnpm desktop) and behaves as expected. - Push to GitHub:
git push origin your-branch-name. - Open a PR: Fill out the PR template completely.
- Be Patient: The maintainers will review your PR as soon as possible. We may ask for changes or refinements.
Before submitting, please ensure:
- You have searched for existing PRs.
- Your code follows the project's style and standards.
- You have verified the change manually (the project does not yet have an automated test suite).
- Your PR description explains what changed and why.
- You agree to the UPL-1.0 license terms.
Trixty's frontend talks to the Rust backend through Tauri's invoke bridge. Tauri automatically converts argument names between the two sides, so a consistent naming convention is required to keep builds working without runtime errors.
Naming convention
- Rust command handlers use
snake_caseparameters (e.g.git_url,root_path). - TypeScript entries in
apps/desktop/src/api/tauri.tsusecamelCase(e.g.gitUrl,rootPath). - Tauri converts between them automatically.
Steps
- Rust — add a
#[tauri::command]to the relevant module (e.g.apps/desktop/src-tauri/src/lib.rs):#[tauri::command] async fn do_something(git_url: String) -> Result<String, String> { // ... Ok("ok".into()) }
- Register it in the
run()builder chain usingtauri::generate_handler. - TypeScript — add the signature to
TauriInvokeMapinapps/desktop/src/api/tauri.tsusingcamelCase:"do_something": { args: { gitUrl: string }; return: string };
- Consume via
safeInvoke("do_something", { gitUrl: "..." })from the frontend.
Note
Tauri-injected parameters such as AppHandle, State<T> or Window are resolved by the runtime and must be omitted from the TypeScript entry. Custom commands do not require per-command entries in apps/desktop/src-tauri/capabilities/*.json in this project — the capability files only declare plugin permissions. Only update them if you add new plugin permissions.
Thank you for helping make Trixty IDE better! ❤️