> ## Documentation Index
> Fetch the complete documentation index at: https://mediadrop.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Contributing

> How to contribute to react-mediadrop

Thanks for your interest in contributing to `react-mediadrop`.

## Install & verify

```sh theme={"theme":{"light":"github-light","dark":"vesper"}}
pnpm install
pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm size
```

This is exactly what CI runs.

## Scope

Check the [Roadmap](/roadmap) and the
[scope reference](https://github.com/autorender/react-mediadrop/blob/main/skills/mediadrop/references/scope.md)
before adding a feature — it's the authoritative "what's real" list.
Don't build around something listed as not implemented; raise it instead.

## Architecture non-negotiables

* The core engine stays framework-free with zero runtime dependencies.
* Retry/backoff lives in one place (`withRetry`) and is never duplicated
  per transport.
* Every transport stays thin — no retry, no concurrency logic of its own.

See [Upload](/guides/upload) and [Writing a custom transport](/guides/custom-transport)
for why this matters.

## Style

Biome (`pnpm format`) formats and lints. No comments beyond what explains
a non-obvious *why* (a hidden constraint, a workaround, something that
would surprise a reader) — code should read clearly enough not to need a
*what* comment.

## Tests

Real regressions, not padding — new tests should exercise an actual
race/edge case (cancel-vs-resolve races, retry exhaustion, reentrancy)
the way the existing suite does, not just happy-path smoke tests.

## Opening a pull request

Maintainers branch directly off latest `main`. Outside contributors fork
the repo first, then branch off their fork's `main`.

If the change is user-facing (bug fix, feature, behavior change), run
`pnpm changeset` and commit the generated file — `changesets/action`
reads these to version and changelog the next release. Skip it for
docs-only or internal changes.

Open the PR against `main`. If it's your first
PR here, its CI run won't start until a maintainer manually approves it —
standard GitHub protection for first-time contributors on public repos,
a one-time step.

Merging requires **1 approving review** and all **4** CI checks
(`lint`, `typecheck`, `test`, `build`) passing. `main` has a linear
history — merges are squash or rebase only, never merge commits.

***

Issue and PR templates, a vulnerability-reporting process, and a
[Code of Conduct](https://github.com/autorender/react-mediadrop/blob/main/CODE_OF_CONDUCT.md)
already exist in the repo. There's no CLA yet.
