# Contributing to Tessera
Thanks for being here! Tessera is built in the open, and contributions of every size are welcome:
a typo fix, a bug report, a translation, a plugin, or a whole feature.
By taking part you agree to follow the [Code of Conduct](CODE_OF_CONDUCT.md).
- [Ways to help](#ways-to-help)
- [Set up your machine](#set-up-your-machine)
- [A tour of the repository](#a-tour-of-the-repository)
- [Pick a first issue](#pick-a-first-issue)
- [Make a change](#make-a-change)
- [Commit messages](#commit-messages)
- [Pull request checklist](#pull-request-checklist)
- [Write a plugin](#write-a-plugin)
- [Security issues](#security-issues)
## Ways to help
- **Report a bug** with the [bug report form](https://github.com/femboypuppy/Tessera-Notes/issues/new?template=bug_report.yml).
Steps to reproduce are the most useful thing you can give us.
- **Suggest a feature** with the [feature request form](https://github.com/femboypuppy/Tessera-Notes/issues/new?template=feature_request.yml).
- **Answer questions** in [Discussions](https://github.com/femboypuppy/Tessera-Notes/discussions).
- **Improve the docs.** Every docs page has an "Edit this page on GitHub" link.
- **Write code**: start with a [good first issue](#pick-a-first-issue).
- **Build a plugin** and share it in the community registry.
## Set up your machine
You need:
- [Node.js 24](https://nodejs.org) (the version is in `.nvmrc`, so `nvm use` works)
- pnpm 11, installed by Corepack
- Git
```bash
git clone https://github.com/femboypuppy/Tessera-Notes.git
cd Tessera-Notes
corepack enable
pnpm install
pnpm dev
```
On Windows, clone into a short folder such as `C:\src`. The Notion import fixtures keep Notion's
real file names, up to 184 characters inside the repository, and Git for Windows refuses paths
over 260 characters ("Filename too long"). To clone deeper than that, turn on long paths first:
`git config --global core.longpaths true`, or for this clone only,
`git clone -c core.longpaths=true https://github.com/femboypuppy/Tessera-Notes.git`.
`pnpm dev` starts the web app (hot reload) and the sync server together — the app proxies `/api`
and `/sync` to the server — and prints the web app's address.
### Everyday commands
| Command | Does |
| ---------------------------- | ------------------------------------------------------------- |
| `pnpm dev` | The web app and the sync server together, with hot reload. |
| `pnpm test` | Every unit test (Vitest). |
| `pnpm test:e2e` | End-to-end tests (Playwright, Chromium and Firefox) against a production build. |
| `pnpm test:e2e:install` | Installs the Playwright browsers (once per machine). |
| `pnpm typecheck` | Type-checks every package. |
| `pnpm lint` | ESLint and Prettier. `pnpm lint:fix` fixes what it can. |
| `pnpm build` | Builds every package and app. |
| `pnpm screenshots e2e/` | Regenerates the screenshots for one area. |
Run one package with `pnpm --filter @tessera/