Thanks for considering a contribution. Reactisma is the companion repo of the Reactisma course, so a few conventions matter more here than in a typical OSS project:
- Every change should be educational. If a refactor is "just" cleaner, write a paragraph in the PR explaining the why.
- PRs map 1:1 with course modules where possible. If your change overlaps a planned module, please coordinate first (open an issue).
- We prefer boring, readable code. No clever one-liners that future course readers will trip over.
- Fork the repo and clone your fork.
- Create a branch off
main:git checkout -b feat/short-description. - Make changes, run
npm run typecheck,npm run lint,npm test. - Commit using conventional commits (see below).
- Push and open a PR against
main. Fill out the template.
Format: <type>(<scope>): <summary>
Types we use:
| Type | When to use |
|---|---|
feat |
A new feature or capability |
fix |
A bug fix |
perf |
A performance improvement |
refactor |
Code change that neither fixes a bug nor adds a feature |
docs |
Documentation only |
test |
Adding/updating tests |
chore |
Tooling, build, dependencies |
style |
Formatting only (no logic change) |
Scopes are loose but try to be one of: vdom, hooks, scheduler, reconciler, dom, styled, nn, memory, ssr, worker, wasm, devtools, course.
Examples:
feat(hooks): add useReducer with action discrimination via TS narrowing
fix(reconciler): preserve component instance when reordering keyed children
perf(nn): switch dual hemispheres to Float32Array layout
docs(course): expand module 4 outline with diagram links
Before requesting review, please confirm:
-
npm run typecheckpasses -
npm run lintpasses (no new warnings either) -
npm run format:checkpasses -
npm testpasses - The PR has a description explaining why (not just what)
- If the change is part of a course module, the module is referenced
- No leftover
console.log, commented-out code, or dead imports
- TypeScript strict mode is non-negotiable. Don't widen types with
any; useunknown+ narrowing. - Functions should fit on a screen. If they don't, split them.
- Prefer pure functions in
utils/. Side effects belong in components or in clearly-named lifecycle hooks. - Hooks must follow the rules of hooks. We will land a custom ESLint rule for this in M3.
Open an issue with a reproduction case (link to a fork, a CodeSandbox, or a minimal .tsx snippet) and the expected vs. actual behavior. Tag with bug, enhancement, question, or course.
By contributing, you agree that your contributions will be licensed under the MIT License.