|  | ## Use reliable links | 
|  |  | 
|  | If you would like to link to a website, | 
|  | do your best to link to a reliable link destination, | 
|  | sometimes known as a permalink. | 
|  |  | 
|  | Even if you update the link in the repo if it changes or breaks, | 
|  | outdated versions might remain in older versions of tools, docs, etc. | 
|  | Sometimes the link destination itself can add an appropriate redirect, | 
|  | but sometimes it can't and other times it's destination is not the best choice. | 
|  |  | 
|  | - If you're not sure if you need a more reliable link, | 
|  | check out [Situations to consider](#situations-to-consider). | 
|  | - If your destination does not already have a stable link, | 
|  | and you think it would benefit from one, | 
|  | follow the instructions in [Create a reliable link](#create-a-reliable-link). | 
|  |  | 
|  | ### Situations to consider | 
|  |  | 
|  | There are many linking situations that could benefit from a more | 
|  | stable/reliable redirect with a memorable URL. | 
|  | For reference, the following are a few situations where | 
|  | they can have a high impact: | 
|  |  | 
|  | - Output from CLI tools like `flutter` and `dart` | 
|  | - Comments or prose in files generated by tools like `flutter create` | 
|  | - API docs in the framework or other bundled packages | 
|  | - Error messages and other diagnostics from the engine, framework, or | 
|  | other Flutter-team maintained packages | 
|  | - Troubleshooting links from DevTools and editors | 
|  |  | 
|  | > [!TIP] | 
|  | > Links that would lead to fragments on the Dart and Flutter sites | 
|  | > should often be replaced with a custom reliable link. | 
|  | > Browsers don't send URI fragments to the server, | 
|  | > so redirecting them needs extra client-side handling. | 
|  |  | 
|  |  | 
|  | ### Create a reliable link | 
|  |  | 
|  | If you need a reliable link, consider | 
|  | adding a tooling redirect to the Flutter documentation site, | 
|  | and using that in place of the intended destination. | 
|  | Tooling redirects are added in a similar fashion to design-doc go links, | 
|  | and the website team will do their best to keep it functional. | 
|  | Once created, a tooling redirect is accessed through a link like | 
|  | starting with `/to/`, such as `flutter.dev/to/gesture-disambiguation`. | 
|  |  | 
|  | Before creating a new tooling link, | 
|  | verify that an appropriate one doesn't exist already. | 
|  | To see what redirects exist already, check the `/to/` entries in | 
|  | [`flutter/website/firebase.json`][flutter-redirects] and | 
|  | [`dart-lang/site-www/firebase.json`][dart-redirects]. | 
|  |  | 
|  | If an appropriate tooling redirect doesn't exist already, | 
|  | create one following these steps: | 
|  |  | 
|  | 1. Open the [`firebase.json` file][flutter-redirects] in the | 
|  | `flutter/website` repository and edit it using the GitHub UI or locally. | 
|  | 2. Determine a short, relevant, and memorable name for the redirect. | 
|  | No special characters are allowed and under 5 words is preferred. | 
|  | Remember users might need to type it manually, or it might be output | 
|  | in a crowded terminal or UI. | 
|  | 3. Convert the name to a `lowercase-with-dashes` format and fill out | 
|  | a redirect entry in the following format with it and the destination URL: | 
|  |  | 
|  | ```json | 
|  | { "source": "/to/<redirect-name>", "destination": "<url>", "type": 301 } | 
|  | ``` | 
|  |  | 
|  | Note that if you are linking to the Flutter docs site itself, | 
|  | don't include the origin of the destination URL, just the path. | 
|  | 4. Place this entry with the other tooling (`/to/`) redirects in the file | 
|  | according to its alphanumerical sorting. | 
|  | Certain editors can sort a selected portion of the redirects as well. | 
|  | 5. Commit your changes, push them if needed, and open a new pull request | 
|  | against the `flutter/website` repository's `main` branch. | 
|  | 6. Set a descriptive pull request title, similar to the following: | 
|  |  | 
|  | ```markdown | 
|  | Add a `/to/<redirect-name>` tooling redirect | 
|  | ``` | 
|  | 7. In the pull request description, include a link to the PR, CL, or | 
|  | wherever else that will make use of the redirect, as well as | 
|  | what project team can be reached out to if it needs to be updated. | 
|  | 8. Unless a website maintainer has feedback about the | 
|  | redirect name, usefulness, destination, or formatting, | 
|  | they will approve and land the change for you. | 
|  | 9. Once your tooling redirect has landed, | 
|  | switch to using the tooling redirect wherever needed. | 
|  | 10. The website maintainers might reach out to you | 
|  | if the redirect needs to be updated, but do consider | 
|  | checking your redirects occasionally to verify they still make sense. | 
|  |  | 
|  | > [!IMPORTANT] | 
|  | > There is a maintenance cost of a tooling redirect, | 
|  | > both for your team and the website maintainers. | 
|  | > | 
|  | > So if the link is being surfaced in a way or location | 
|  | > that users will quickly see an updated version, | 
|  | > a tooling redirect might not be necessary. | 
|  | > The same goes for links that are only needed for a short time. | 
|  |  | 
|  | [flutter-redirects]: https://github.com/flutter/website/blob/main/firebase.json | 
|  | [dart-redirects]: https://github.com/dart-lang/site-www/blob/main/firebase.json |