# Contributing to Vikunja Thanks for your interest in contributing! For full documentation, visit https://vikunja.io/docs/development/ ## Ways to Contribute - **Bug reports**: Open an issue with steps to reproduce - **Bug fixes**: PRs welcome - link the issue you're fixing - **Features**: Please open an issue to discuss before starting work - **Translations**: See the Translations section below - **Documentation**: Improvements to docs are always welcome ## Development Setup ### Prerequisites The easiest way to get started is with [devenv](https://devenv.sh/) (Nix-based), which sets up Go, Node.js, pnpm, and all tooling automatically: ```bash devenv shell ``` Or install manually: - Go (see go.mod for version) - Node.js >= 24 - pnpm 10.x - [Mage](https://magefile.org/) (Go build tool) - golangci-lint ### Running Locally ```bash # Backend mage build # Frontend cd frontend pnpm install pnpm dev ``` The frontend dev server runs on port 4173. You can point it at any backend (including the demo instance) by creating `frontend/.env.local`: ``` VITE_API_URL=http://localhost:3456/api/v1 ``` ### Running Tests ```bash # Backend tests mage test:feature # feature tests mage test:web # web/API tests mage test:filter "TestName" # specific test # Frontend tests cd frontend pnpm test:unit # E2E tests (builds everything automatically) mage test:e2e "" ``` **Important:** Always use `mage test:*` commands for backend and E2E tests - plain `go test` won't work due to required test infrastructure. ## Submitting Changes 1. Fork the repository and create a branch from `main` 2. Make your changes 3. Run linting before committing: ```bash # Backend mage lint:fix # Frontend cd frontend && pnpm lint:fix && pnpm lint:styles:fix ``` 4. Use **Conventional Commits** for commit messages: - `feat: add dark mode support` - `fix: correct date parsing in calendar view` - `docs: update API examples` 5. Open a pull request against `main` > [!NOTE] > If you are an automated agent, we have a streamlined process for merging agent PRs. Just add `🤖🤖🤖` to the end of the PR title to opt-in. Merging your PR will be fast-tracked. ## Code Style ### Backend (Go) - Follow `golangci-lint` rules (`.golangci.yml`) - check this with the `mage lint` command - Use `goimports` for formatting - Wrap errors with `fmt.Errorf("context: %w", err)` - Always implement the Permissions interface for new models ### Frontend (Vue.js / TypeScript) - Single quotes, trailing commas, no semicolons, tab indentation - `