Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: Ask a question
url: https://github.com/orgs/tsvrc/discussions
about: Questions go in Discussions, not the issue tracker.
35 changes: 8 additions & 27 deletions .github/ISSUE_TEMPLATE/doc_issue.yml
Original file line number Diff line number Diff line change
@@ -1,35 +1,16 @@
name: Documentation issue
description: A page is wrong, unclear, or missing something.
description: A page is wrong, unclear or missing something.
labels: [documentation]
body:
- type: input
id: page-url
attributes:
label: Page URL
description: The tsvrc.com URL of the page, if it exists yet.
validations:
required: false
- type: input
id: project
attributes:
label: Project
description: Which project's docs this is about (e.g. tsvrc or udon-test-kit).
validations:
required: true
- type: dropdown
id: kind
attributes:
label: What's wrong?
options:
- Incorrect
- Unclear
- Missing
validations:
required: true
- type: textarea
id: details
attributes:
label: Details
description: What's wrong, and what would fix it?
label: What's wrong?
description: What the page says or leaves out, and what would fix it.
validations:
required: true
- type: input
id: page-url
attributes:
label: Page URL
description: The tsvrc.com address of the page, if it exists.
11 changes: 0 additions & 11 deletions .github/PULL_REQUEST_TEMPLATE.md

This file was deleted.

8 changes: 4 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ link, which `npm start` doesn't catch.
## Gotchas

- `sidebars.ts` is written by hand. A `dirName` pointed at a leaf folder returns an unlabeled flat
list, so a category's `label` comes from its wrapping `{type: 'category', ...}` node, not a
list, so the `label` of a category comes from its wrapping `{type: 'category', ...}` node, not a
`_category_.json`.
- Each project's code lives in its own repo (`tsvrc-core`, `udon-test-kit`), and nothing keeps it in
sync with this one. When a project's public behavior changes, check its pages here, and the Core
testing pages too when Udon Test Kit changes.
- The code of each project lives in its own repo (`tsvrc-core`, `udon-test-kit`), and nothing
keeps it in sync with this one. When the public behavior of a project changes, check its pages
here, and the Core testing pages too when Udon Test Kit changes.
114 changes: 56 additions & 58 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,78 +1,76 @@
# Contributing to TsVRC docs

Fixes, new pages and translations are welcome. Before you add a page or change how the site is
organized, open an issue to agree on it. Questions go in
[GitHub Discussions](https://github.com/orgs/tsvrc/discussions).

## Setup

- **Node 20+** (see `engines` in `package.json`).
- `npm install`, then `npm start` for a hot-reloading dev server at
`http://localhost:3000`. Config changes (`docusaurus.config.ts`) need a server restart,
content changes don't.
- `npm run build` before calling any doc change done. `onBrokenLinks: 'throw'` means a
broken link fails the build, so this catches mistakes `npm start` won't.
You need Node 20 or later.

```bash
npm install
npm start
```

`npm start` serves the site at `http://localhost:3000` and reloads it when content changes. Restart
it after changing `docusaurus.config.ts`. Before you open a pull request, run `npm run build`: it
builds both languages and fails on a broken link, which `npm start` doesn't catch. Every push to
`main` deploys the site.

## Writing docs
## Writing a page

This site follows the [Diátaxis framework](https://diataxis.fr/) (tutorial / how-to /
reference / explanation) and a house writing style aimed at not reading like AI-generated
prose. Read [STYLE_GUIDE.md](STYLE_GUIDE.md) before writing or editing any page: which of
the four categories a page belongs to, section conventions, linking instead of
duplicating, words/phrases to avoid, sentence shape, formatting rules.
Pages follow the [Diátaxis framework](https://diataxis.fr/) and [STYLE_GUIDE.md](STYLE_GUIDE.md).
Read the style guide before you write or edit a page. A page about a project must match what its
code does.

## Multi-project layout

Each project under the `tsvrc` org gets its own `docs/<project>/` folder here rather than
its own docs repo. Adding docs for a new project means adding a folder here and a
matching top-level category in `sidebars.ts`, not creating a new repo. Every project shares
one sidebar, so a category whose label another project already uses, such as "Reference",
needs a unique `key`; without one, the Spanish build fails on a duplicate translation key.
`docs/udon-test-kit/` is set up this way.
Each TsVRC project gets its own `docs/<project>/` folder here instead of its own docs repo, plus a
top-level category in `sidebars.ts`. Every project shares one sidebar, so a category whose label
another project already uses, such as "Reference", needs a unique `key`. Without one, the Spanish
build fails on a duplicate translation key. `docs/udon-test-kit/` is set up this way.

A page every project shares, such as [Install a TsVRC package](docs/install-a-package.md),
sits at the root of `docs/` instead. Each project's own install page links to it and adds only
what's specific to that project: the package name, requirements, and how to check that it
worked.
A page every project shares, such as [Install a TsVRC package](docs/install-a-package.md), sits at
the root of `docs/`. Each project install page links to it and adds only what's specific to that
project: the package name, requirements, and how to check that it worked.

A project's docs stand on their own. When one project depends on another, as TsVRC does on
Udon Test Kit, the dependent project's pages link to the other's where a reader needs it, and
the project depended on never mentions its consumers.
The docs of a project stand on their own. When one project depends on another, as Core does on Udon
Test Kit, the dependent project links to the other where a reader needs it, and the project
depended on never mentions its consumers.

## Adding a translation

Docs content stays English-only and unversioned under `docs/<project>/`. A translation
lives in a parallel tree at
`i18n/<locale>/docusaurus-plugin-content-docs/current/<project>/`, mirroring the same
relative paths and filenames; adding a language never touches the English files. See
`docs/core/intro.md` and its Spanish counterpart for a worked example to copy.
`src/pages/` translates differently: via `@docusaurus/Translate` in the component source,
with strings in `i18n/<locale>/code.json`.

A heading another page links to by anchor needs a stable id that survives translation,
since translating the heading text changes the anchor. The Docusaurus MDX v3 syntax for this
is a comment, not `{#id}`: `## Play Mode tests {/* #play-mode-tests */}`. Sidebar category
labels live in `sidebars.ts` itself, not a translatable file, so they render in English for
every locale regardless of translated content underneath. Don't override the Docusaurus
theme chrome (pagination, admonition labels, sidebar buttons) in this site's own
`code.json`; it ships its own translated defaults per locale. The search plugin
(`@easyops-cn/docusaurus-search-local`) ships no Spanish, so its `theme.SearchBar.*` and
`theme.SearchPage.*` strings are the exception and live in `code.json`.

Before translating a technical term, check how the target language's own community or
official docs (the localized Unity manual, the GitHub glossary, the VRChat community) actually
render it rather than translating literally. Some terms stay in English even in translated
prose, others have a real idiomatic equivalent that isn't the literal word-for-word choice.
This repo's own code identifiers (`_ts.Memory`, `TsStart`) are never translated, including
inside prose.
English pages live in `docs/<project>/`. A translation mirrors the same paths and file names under
`i18n/<locale>/docusaurus-plugin-content-docs/current/<project>/`, so adding a language never
touches the English files. `docs/core/intro.md` and its Spanish counterpart are a worked example.
Pages in `src/pages/` translate through `@docusaurus/Translate` instead, with their strings in
`i18n/<locale>/code.json`.

- A heading that another page links to by anchor needs an id that survives translation. In
Docusaurus MDX v3 that's a comment, not `{#id}`: `## Play Mode tests {/* #play-mode-tests */}`.
- Sidebar category labels live in `sidebars.ts`, which isn't translated, so they stay English in
every locale.
- Don't override the Docusaurus theme strings (pagination, admonition labels, sidebar buttons) in
`code.json`: the theme ships its own translations. The search plugin
(`@easyops-cn/docusaurus-search-local`) ships no Spanish, so its `theme.SearchBar.*` and
`theme.SearchPage.*` strings are the exception.
- Before translating a technical term, check how the localized Unity manual, the GitHub glossary
or the VRChat community writes it. Some terms stay in English. Code identifiers such as
`_ts.Memory` and `TsStart` are never translated, in prose either.

## Submitting a pull request

1. Sign off every commit (`git commit -s`) per the [Developer Certificate of
Origin](https://developercertificate.org/). This certifies you wrote the change, or
otherwise have the right to submit it under this project's license (CC BY 4.0 for
docs content, see [README.md](README.md#license) for the code/content split).
2. If AI tooling helped write part of your change, say so in the PR description, briefly.
You're still fully responsible for the contribution, read, understand, and check it
renders correctly before submitting, the same as if you'd written it yourself.
3. Fill in the PR template's checklist and open the PR. Community conduct is covered by
the [org-wide Code of Conduct](https://github.com/tsvrc/.github/blob/main/CODE_OF_CONDUCT.md).
1. Sign off every commit (`git commit -s`) per the
[Developer Certificate of Origin](https://developercertificate.org/). It certifies you wrote the
change, or otherwise have the right to submit it under the CC BY 4.0 license, so only you can
add it, never a tool. A check fails the pull request if any of its commits isn't signed off.
2. If AI tools helped, say which parts and how in the pull request description. You're the author
either way: read, understand and check all of it in the built site before you submit it, and be
ready to explain it in review. A pull request that's mostly unreviewed AI output, and would take
longer to review than it saves, will be closed.
3. Open the pull request, describing what it changes and why. Community conduct is covered by the
[org-wide Code of Conduct](https://github.com/tsvrc/.github/blob/main/CODE_OF_CONDUCT.md).

## Reporting a security vulnerability

Expand Down
61 changes: 16 additions & 45 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,54 +3,25 @@
[![Deploy](https://github.com/tsvrc/docs/actions/workflows/deploy.yml/badge.svg)](https://github.com/tsvrc/docs/actions/workflows/deploy.yml)
[![License: CC BY 4.0](https://img.shields.io/badge/license-CC%20BY%204.0-58a6ff?labelColor=161b22)](LICENSE)

The [Docusaurus](https://docusaurus.io/) site behind [tsvrc.com](https://tsvrc.com),
documenting every project under the `tsvrc` GitHub org. Each project's code lives in its own
repository, such as [`tsvrc/tsvrc-core`](https://github.com/tsvrc/tsvrc-core) for
Core and [`tsvrc/udon-test-kit`](https://github.com/tsvrc/udon-test-kit) for Udon Test
Kit; this repo is docs and content only.

## Development

```bash
npm install
npm start
```

`npm start` runs a hot-reloading dev server at `http://localhost:3000`. Content changes
reload live; changes to `docusaurus.config.ts` need a server restart.

```bash
npm run build
```

Builds the static site into `build/`. `onBrokenLinks: 'throw'` means a broken internal
link fails this command, so run it before calling a doc change done.

## Deployment

Every push to `main` builds and deploys to GitHub Pages automatically via
[`.github/workflows/deploy.yml`](.github/workflows/deploy.yml). There's no manual deploy
step.

## Support

Support TsVRC at [tsvrc.com/support](https://tsvrc.com/support).
The [Docusaurus](https://docusaurus.io/) site behind [tsvrc.com](https://tsvrc.com), with the docs
for every TsVRC project. The code of each project lives in its own repository, such as
[tsvrc/tsvrc-core](https://github.com/tsvrc/tsvrc-core) for Core and
[tsvrc/udon-test-kit](https://github.com/tsvrc/udon-test-kit) for Udon Test Kit.

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md) for the writing style guide, the multi-project
layout, and how to submit a change. Community conduct is covered by the
[org-wide Code of Conduct](https://github.com/tsvrc/.github/blob/main/CODE_OF_CONDUCT.md),
and [GOVERNANCE.md](https://github.com/tsvrc/.github/blob/main/GOVERNANCE.md) covers how
decisions get made. Found a security issue? See [SECURITY.md](SECURITY.md) rather than
opening a public issue.
Fixes, new pages and translations are welcome. [CONTRIBUTING.md](CONTRIBUTING.md) covers running
the site locally, writing a page, and opening a pull request. Ask questions in
[GitHub Discussions](https://github.com/orgs/tsvrc/discussions) rather than in an issue.

## License
Found a security issue? Follow [SECURITY.md](SECURITY.md) instead of opening a public issue.
Community conduct is covered by the
[org-wide Code of Conduct](https://github.com/tsvrc/.github/blob/main/CODE_OF_CONDUCT.md), and
[GOVERNANCE.md](https://github.com/tsvrc/.github/blob/main/GOVERNANCE.md) covers how decisions get
made.

This repository is licensed under [CC BY 4.0](LICENSE). Code samples embedded in a
project's doc pages (under `docs/<project>/`) that are drawn directly from that project's
own repository keep that project's license, not this repository's, since they originate
there. Check the linked project's own `LICENSE` for the specific terms.
## License

The TsVRC name and logo are governed separately, see
[TRADEMARK.md](https://github.com/tsvrc/.github/blob/main/TRADEMARK.md).
Copyright 2026 Antony Seas, licensed under CC BY 4.0, see [LICENSE](LICENSE). A code sample taken
from a project repository keeps the license of that project. The TsVRC name and logo are governed
separately, see [TRADEMARK.md](https://github.com/tsvrc/.github/blob/main/TRADEMARK.md).
22 changes: 12 additions & 10 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,24 @@

## Reporting a vulnerability

Don't open a public issue. Use [GitHub private vulnerability
reporting](https://github.com/tsvrc/docs/security/advisories/new) for this repository
instead, so the report isn't visible before a fix is available.
Don't open a public issue. Use
[GitHub private vulnerability reporting](https://github.com/tsvrc/docs/security/advisories/new)
for this repository instead, so the report isn't visible before a fix is available.

If that's not accessible to you for some reason, contact
[@ToniSeas](https://github.com/ToniSeas) directly.

## Scope

This covers this repository: the Docusaurus site's own code and its dependencies (for
example, a vulnerable npm package, or an XSS-style issue in the site itself). It doesn't
cover `tsvrc-core`, see [that repo's SECURITY.md](https://github.com/tsvrc/tsvrc-core/blob/main/SECURITY.md)
instead. Factually wrong documentation content is a normal bug report, not a security
issue, open a regular issue for that.
This covers the site itself: its code and its npm dependencies, such as a vulnerable package or a
cross-site scripting issue on a page. The code of each project has its own security policy, in its
repository. A page with wrong information is a normal bug, so open an issue for it.

## Supported versions

Only the live site, built from `main`, is supported.

## Response

This project is maintained by one person in their spare time. There's no guaranteed
response time or SLA, but security reports get priority over other issues.
This project is maintained by one person in their spare time. There's no guaranteed response time,
but security reports get priority over other issues.
6 changes: 3 additions & 3 deletions docs/core/add-to-your-project.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ Install **TsVRC Core** (`com.tsvrc.core`) as described in

Core depends on [Udon Test Kit](/docs/udon-test-kit/intro) (`com.tsvrc.udon-test-kit`) for its
testing helpers. The Creator Companion installs it along with Core. With the `.unitypackage`,
import [the kit's](/docs/udon-test-kit/add-to-your-project) too, unless your project already has
it.
import the [Udon Test Kit](/docs/udon-test-kit/add-to-your-project) one too, unless your project
already has the kit.

You'll know it worked when the Unity menu bar gains a **Tsvrc** menu. Everything Core does
from here runs from there.
Expand All @@ -31,7 +31,7 @@ from here runs from there.

The Core manifest description sums it up: structured initialization, dependency wiring,
and editor codegen tooling for building VRChat worlds with UdonSharp. Concretely, the
package compiles as one runtime assembly (`Tsvrc.Runtime`), the base classes your world's
package compiles as one runtime assembly (`Tsvrc.Runtime`), the base classes your world
scripts extend and call into, and one editor-only assembly (`Tsvrc.Editor`) holding all
the codegen and Configure-window tooling. See [How Core fits
together](./core-concepts/how-it-fits-together) for how those two halves relate.
Expand Down
10 changes: 2 additions & 8 deletions docs/udon-test-kit/add-to-your-project.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,11 @@ Install the kit in a VRChat world project, then create the test assemblies your
## Install the package

Install **Udon Test Kit** (`com.tsvrc.udon-test-kit`) as described in
[Install a TsVRC package](/docs/install-a-package). Its `.unitypackage` is on the kit's
[GitHub releases](https://github.com/tsvrc/udon-test-kit/releases).
[Install a TsVRC package](/docs/install-a-package). Its `.unitypackage` is on the
[releases page](https://github.com/tsvrc/udon-test-kit/releases).

You'll know it worked when the Unity menu bar has **Tools > TsVRC > Udon Test Kit**.

:::warning
A project can hold only one copy of the kit. Two copies mean two assemblies named `Tsvrc.UdonTestKit`,
which stop the whole project compiling. Don't import the `.unitypackage` into a project that
already has the kit, including a copy another package installed as its dependency.
:::

## Create your test assemblies

Unity Test Framework finds tests in test assemblies, and the kit creates the three a world needs.
Expand Down
2 changes: 1 addition & 1 deletion docusaurus.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ const config: Config = {
to: '/support',
},
],
copyright: `Copyright © ${new Date().getFullYear()} TsVRC. Not affiliated with or endorsed by VRChat Inc.`,
copyright: `Copyright © ${new Date().getFullYear()} Antony Seas. Not affiliated with or endorsed by VRChat Inc.`,
},
prism: {
theme: prismThemes.github,
Expand Down
2 changes: 1 addition & 1 deletion i18n/es/docusaurus-theme-classic/footer.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"description": "The label of footer link with label=Support linking to /support"
},
"copyright": {
"message": "Copyright © 2026 TsVRC. No afiliado ni respaldado por VRChat Inc.",
"message": "Copyright © 2026 Antony Seas. No afiliado ni respaldado por VRChat Inc.",
"description": "The footer copyright"
}
}
Loading
Loading