First off — thank you for your interest in contributing! 🎉
OpenSplit is an open-source, cross-platform speedrun split timer built with Go + React/TypeScript via Wails. This guide explains how to get set up, how we work, and how to land great PRs.
- Ways to Contribute
- Prerequisites
- Quick Start (Local Dev)
- Build, Test, and Lint
- Skins & Theming
- Git & PR Workflow
- Code Style & Conventions
- OS-Specific Notes
- Reporting Bugs & Security Issues
- License
- Issues: bug reports, feature requests, UX feedback (use the provided templates).
- Code: fixes, features, tests, refactors.
- Docs: README improvements, developer notes, in-app help.
- Skins: new themes (CSS) and assets.
- Testing: try nightlies, report regressions, share platform-specific findings.
This is a very high level introduction to getting started with development. For a more indepth look at the application check the docs
- Go ≥ 1.22 - Installation
- Node.js ≥ 20 and npm - Installation
- Wails v2 CLI — install with:
go install github.com/wailsapp/wails/v2/cmd/wails@latest - Task - install with:
go install github.com/go-task/task/v3/cmd/task@latest - Git (on Windows, use Git Bash or PowerShell (pwsh) for scripts)
- golang CI Installation - install with GitBash if you're on Windows.
It's a lot easier to deal with its complaints locally than looking at CI logs
task clean (Only needed once)
task dev
The app should launch. Edit files in frontend/ or Go packages and it will rebuild/reload.
Production build
task build- Outputs appear in
build/bin/
Tests
- Run all Go tests:
task test
Lint & format
- Will run go vet, and frontend lint:
task lint
Note: go vet will return an error in the windows hotkey provider package. This is normal.
CI runs tests (and optionally lint) on PRs. Keep your branch green for a fast merge.
Skins are plain CSS. A typical skin folder contains:
tokens.css— CSS variables (colors, fonts, radii, spacing)components.css— component styles that consume those tokensimages/— optional backgrounds/iconsfonts/— optional@font-facesources
Guidelines:
- Define tokens in
:root; components consume them. - Use relative URLs (e.g.,
images/bg.png) so assets travel with the skin. - Using
@layerto separate tokens vs. components is encouraged.
Include a screenshot/GIF when submitting a skin PR. 🎨
- Branch from
main: e.g.,feat/split-editor-dragorfix/win-hotkeys-extended - Conventional Commits (small, focused commits):
feat: add Speedrun.com search
fix(windows): handle extended keys in hook
chore(ci): add nightly workflow - Run tests locally:
task test - Run lint locally
task lint - Open a Pull Request:
- Fill out the PR template
- Add screenshots/GIFs for UI changes
- Link issues with
Fixes #123when applicable
- Address review feedback; we squash or rebase as needed.
For larger features, open an issue to discuss approach before coding.
General
- Follow
.editorconfigfor line endings/indentation. - Keep functions small; comment intent where it isn’t obvious.
Go
- Don’t store contexts long-term; pass them down call chains.
- Use build tags for OS-specific code (e.g.,
*_windows.go). - Prefer small interfaces for runtime adapters (e.g.,
RuntimeProvider) and inject them for testability. - Unit-test behavioral logic; treat Wails adapters and OS hooks as integration areas.
TypeScript/React
- Prefer strict TypeScript.
- Keep components small; extract logic to hooks.
- Use CSS variables from skin tokens for theming.
Commits
- Use Conventional Commits (
feat:,fix:,docs:,refactor:,test:,chore:) in the imperative mood.
- Windows: Global hotkeys are implemented first. When casting OS pointers (e.g., from Win32 callbacks), convert and immediately copy into Go values; don’t retain foreign pointers.
- macOS/Linux: Global hotkeys are planned; APIs differ.
- Wails builds: It’s safe to delete
build/bin/or usewails build -clean. Do not delete the entirebuild/folder unless the resource files (icons/manifests) are tracked and restored.
- Bugs/requests: open an issue using the templates with repro steps, logs, and OS details.
- Security: report privately via GitHub Security Advisories or the contact listed in
SECURITY.md(avoid public issues for vulnerabilities).
By contributing, you agree that your contributions are licensed under the MIT License (see LICENSE). There is no CLA at this time; if that changes, we’ll document it here.
Your time and ideas make OpenSplit better for everyone. If you get stuck or want guidance on where to start, open a Discussion or issue, or find us on Discord.