Thank you for your interest in contributing to QA Studio! We're excited to have you join our community of QA engineers building better testing tools.
- Code of Conduct
- Getting Started
- How to Contribute
- Development Setup
- Pull Request Process
- Coding Guidelines
- Testing
- Documentation
- Community
By participating in this project, you agree to maintain a respectful, inclusive, and collaborative environment. We welcome contributors of all skill levels and backgrounds.
Our values:
- Be respectful and considerate
- Focus on constructive feedback
- Welcome newcomers and help them learn
- Prioritize the community's needs over individual preferences
You don't need to be a coding expert to contribute! Here are various ways to help:
- 🐛 Report bugs - Found a bug? Open an issue
- 💡 Suggest features - Have an idea? Start a discussion
- 📝 Improve documentation - Help make our docs clearer
- 🧪 Write tests - Add test coverage for existing features
- 🔧 Fix bugs - Pick up a good first issue
- ✨ Add features - Implement new functionality
- 🎨 Improve UI/UX - Make the interface better
- 💬 Help others - Answer questions on Discord or GitHub Discussions
New to the project? Look for issues labeled good first issue. These are specifically chosen to be beginner-friendly.
Before reporting a bug:
- Check if it's already been reported in Issues
- Try to reproduce it with the latest version
- Gather relevant information (browser, OS, error messages, screenshots)
Create a bug report with:
- Clear, descriptive title
- Steps to reproduce the issue
- Expected vs. actual behavior
- Environment details (OS, browser, QA Studio version)
- Screenshots or error logs if applicable
Feature requests are welcome! Before suggesting:
- Check existing discussions
- Consider if it aligns with QA Studio's core mission
- Think about how it benefits the broader community
Create a feature request with:
- Problem statement (what problem does this solve?)
- Proposed solution
- Alternative solutions you've considered
- How this helps other users
- For general questions, use GitHub Discussions
- For real-time chat, join our Discord server
- For bugs, use GitHub Issues
- Node.js 18+ and npm
- PostgreSQL 14+ or Docker
- Git
-
Fork and clone the repository
git clone https://github.com/YOUR_USERNAME/studio.git cd studio -
Install dependencies
npm install
-
Set up environment variables
cp .env.example .env.local
Edit
.env.localwith your configuration:DATABASE_URL="postgresql://user:password@localhost:5432/qa_studio" BLOB_READ_WRITE_TOKEN="your-vercel-blob-token" ENCRYPTION_KEY="your-32-byte-hex-key" CRON_SECRET="your-64-character-hex-string"
-
Set up the database
npx prisma generate npx prisma db push
-
Start the development server
npm run dev
# Start PostgreSQL via Docker Compose
npm run docker:dev
# In another terminal, run the app
npm run dev- Check for existing work - Search issues and PRs to avoid duplicates
- Discuss large changes - For significant features, open a discussion first
- Create an issue - For bugs or features, create an issue before coding
-
Create a feature branch
git checkout -b feature/your-feature-name # or git checkout -b fix/bug-description -
Make your changes
- Follow our coding guidelines
- Write tests for new functionality
- Update documentation as needed
- Keep commits focused and atomic
-
Run checks before you commit
CI runs the same gates on every pull request. Run these locally before
git commitso you do not wait on a failed workflow:npm run format # Apply Prettier (required — CI fails if files are unformatted) npm run check # Svelte/TypeScript typecheck (required for code changes)
For broader validation (recommended when you change application logic):
npm run lint # Prettier check + ESLint npm run test:unit -- --run # Unit tests
Important:
npm run formatrewrites files in place. Stage and include any formatting changes in your commit. The Format Check workflow runsnpm run formatand fails ifgit statusis not clean afterward.If
npm run checkfails with missing$lib/paraglide/*modules, compile i18n first:npx @inlang/paraglide-js compile --project ./project.inlang --outdir ./src/lib/paraglide
-
Commit your changes
Use clear, descriptive commit messages:
git commit -m "feat: add test case bulk import feature" git commit -m "fix: resolve authentication redirect loop" git commit -m "docs: update API documentation for test runs"
Commit message format:
feat:New featurefix:Bug fixdocs:Documentation changesstyle:Code style changes (formatting, etc.)refactor:Code refactoringtest:Adding or updating testschore:Maintenance tasks
-
Push to your fork
git push origin feature/your-feature-name
-
Open a Pull Request
- Use a clear, descriptive title
- Reference related issues (e.g., "Fixes #123")
- Describe what changed and why
- Include screenshots for UI changes
- Mark as draft if work is in progress
- Automated checks - CI runs formatting (
npm run format), type checking (npm run check), and tests — run these locally before pushing (see step 3 above) - Code review - A maintainer will review your code
- Feedback - Address any requested changes
- Approval - Once approved, a maintainer will merge
Tips for faster reviews:
- Keep PRs focused and small (easier to review)
- Write clear descriptions
- Respond promptly to feedback
- Be patient - reviews may take a few days
- Use TypeScript for all code
- Avoid
anytypes - use proper typing - Export types from
$lib/types.ts
We use Prettier and ESLint for consistent formatting:
npm run format # Format code
npm run lint # Lint codeKey conventions:
- Use tabs for indentation (project standard)
- Use single quotes for strings
- No semicolons (Prettier removes them)
- Prefer
constoverlet, avoidvar - Use meaningful variable names
- Use Svelte 5 runes (
$state,$derived,$effect) - Keep components focused and reusable
- Use Skeleton UI components when possible
- Follow existing component patterns
Example:
<script lang="ts">
import { Button } from '@skeletonlabs/skeleton-svelte';
let count = $state(0);
let doubled = $derived(count * 2);
</script>
<Button onclick={() => count++}>
Count: {count} (doubled: {doubled})
</Button>- Use Prisma for all database operations
- Write migrations for schema changes
- Use transactions for multi-step operations
- Follow import conventions (see
CLAUDE.md)
Example:
import { db } from '$lib/server/db';
import { Prisma } from '$prisma/client';
const project = await db.project.create({
data: {
name: 'New Project',
key: 'PROJ',
createdBy: userId
}
});- Use
requireAuthfor protected endpoints - Validate inputs with Zod schemas (when using
sveltekit-api) - Return proper HTTP status codes
- Handle errors gracefully
Example:
import { requireAuth } from '$lib/server/auth';
import { json } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
export const POST: RequestHandler = async (event) => {
const userId = await requireAuth(event);
const body = await event.request.json();
// Validate, process, return
return json({ success: true });
};npm run test:unit # Unit tests
npm run test:e2e # End-to-end tests with Playwright
npm run test # All testsUnit tests (Vitest):
import { describe, it, expect } from 'vitest';
import { generateId } from '$lib/server/ids';
describe('generateId', () => {
it('should generate unique IDs', () => {
const id1 = generateId();
const id2 = generateId();
expect(id1).not.toBe(id2);
});
});E2E tests (Playwright):
import { test, expect } from '@playwright/test';
test('user can create a project', async ({ page }) => {
await page.goto('/projects/new');
await page.fill('[name="name"]', 'Test Project');
await page.fill('[name="key"]', 'TEST');
await page.click('button[type="submit"]');
await expect(page).toHaveURL(/\/projects\/TEST/);
});- Code comments - Explain complex logic
- README.md - Project overview and quick start
- CLAUDE.md - Detailed architecture and conventions
- API docs - Auto-generated from schemas
- Blog posts - Feature announcements
- Be clear and concise
- Include code examples
- Keep it up to date
- Add screenshots for UI features
- Link to related documentation
When you add or change features:
- Update relevant documentation files
- Add JSDoc comments for functions
- Update API schemas in
src/lib/api/schemas.ts - Consider writing a blog post for major features
- GitHub Discussions - Feature requests, questions, ideas
- GitHub Issues - Bug reports, concrete tasks
- Discord - Real-time chat, community support
- Blog - Feature announcements, tutorials
Stuck? Here's how to get help:
- Check documentation - README, CLAUDE.md, API docs
- Search existing issues - Someone may have had the same problem
- Ask on Discord - Community members can help
- Open a discussion - For open-ended questions
Contributors are recognized in:
- GitHub contributor graph
- Release notes (for significant contributions)
- Community shoutouts on Discord
By contributing to QA Studio, you agree that your contributions will be licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).
This means:
- Your code will be open source
- Anyone using it as a network service must share their modifications
- Derivative works must use the same license
See the LICENSE file for full details.
Have questions about contributing?
- Join our Discord server
- Start a GitHub Discussion
- Email: ben@qastudio.dev
Thank you for contributing to QA Studio! 🎉