From da75a62f6e4899b679f8883ee57389b377e84217 Mon Sep 17 00:00:00 2001 From: Kristin Martin Date: Thu, 22 Oct 2026 18:12:13 +0000 Subject: [PATCH 1/2] Narrow Vale to Fly's word list and doubled words, with no external packages --- .github/workflows/vale-docs-linter.yml | 5 ++ .vale.ini | 84 +++++++------------------- styles/Fly/WordList.yml | 3 - 3 files changed, 26 insertions(+), 66 deletions(-) diff --git a/.github/workflows/vale-docs-linter.yml b/.github/workflows/vale-docs-linter.yml index c4139030da..48ccaa61f4 100644 --- a/.github/workflows/vale-docs-linter.yml +++ b/.github/workflows/vale-docs-linter.yml @@ -47,6 +47,11 @@ jobs: # github-pr-check, github-pr-review, github-check reporter: github-pr-check fail_on_error: false + # Pinned so a new Vale release can't change what the check does + # without a PR. 3.24.0 is what "latest" resolved to on 22 Oct 2026. + version: 3.24.0 + # .vale.ini lists no packages, so there is nothing to download. + sync: false env: # Required, set by GitHub actions automatically: # https://docs.github.com/en/actions/security-guides/automatic-token-authentication#about-the-github_token-secret diff --git a/.vale.ini b/.vale.ini index 478bac798b..a7e28dfb28 100644 --- a/.vale.ini +++ b/.vale.ini @@ -6,80 +6,38 @@ MinAlertLevel = suggestion SkippedScopes = script -# Pinned by release URL rather than tracking latest, so a new upstream version -# cannot start enforcing rules nobody has reviewed. `vale sync` fetches these, -# and the action runs it. `Packages` takes URLs but not name@version. -Packages = https://github.com/vale-cli/Google/releases/download/v0.6.3/Google.zip, https://github.com/vale-cli/proselint/releases/download/v0.3.4/proselint.zip, https://github.com/vale-cli/write-good/releases/download/v0.4.1/write-good.zip +# Only Fly's own style and Vale's built-in rules. The Google, proselint and +# write-good packages are gone: nearly all of their rules were already off, +# and the rest flagged things nobody acted on. With no packages there is +# nothing for `vale sync` to fetch, so the workflow skips it. +# +# What runs: Fly.WordList, the house vocabulary, and Vale.Repetition, which +# catches doubled words. [*.{md,mdx,markerb}] -BasedOnStyles = Fly, Google, proselint, Vale, write-good +BasedOnStyles = Fly, Vale -# Fly rules that we can turn back on when other things get cleaned up Fly.Exclamation = NO Fly.Headings = NO Fly.Latin = NO -Fly.Machine = NO # we can do an initial search and replace and then this rule will be less noisy and more useful +Fly.Machine = NO Fly.OxfordComma = NO -Fly.SentenceLength = NO # turn on later; then reduce further? -Fly.Spelling = NO # off until the vocabulary covers MDX pages: 369 unflagged-before terms, mostly product and tool names +Fly.SentenceLength = NO +Fly.Spelling = NO # off for good: covering MDX pages meant vetting 369 terms, then maintaining the list Fly.Us = NO -# other style stuff turned off temporarily -Google.Contractions = NO -Google.DateFormat = NO -Google.EmDash = NO -Google.EnDash = NO -Google.FirstPerson = NO -Google.HeadingPunctuation = NO -Google.LyHyphens = NO -Google.OptionalPlurals = NO -Google.Ordinal = NO -Google.Periods = NO -Google.Ranges = NO -Google.Slang = NO -Google.Spelling = NO +Vale.Avoid = NO # its one reject-list entry, healthcheck, is already in Fly.WordList +Vale.Repetition = warning # error by default, which shows a doubled word as a red annotation +Vale.Spelling = NO # Fly.Spelling would replace it, and that's off +Vale.Terms = NO # enforces vocab-term casing even inside code, and prints raw regex vocab entries as suggested fixes -proselint.But = NO -proselint.Cliches = NO -proselint.Typography = NO -proselint.Very = NO +# Generated in other repos, so a suggestion here can't be acted on in this +# one: flyctl/cmd comes from superfly/flyctl, models.mdx from the Machines spec. +[flyctl/cmd/*.mdx] +BasedOnStyles = -write-good.Passive = NO -write-good.So = NO -write-good.ThereIs = NO -write-good.TooWordy = NO - - -# Google style guide stuff that we're turning off or replacing permanently -Google.Acronyms = NO # we don't have a rule for acronyms yet and this is noisy -Google.AMPM = NO # don't need -Google.Colons = NO # don't need -Google.Ellipses = NO # don't need -Google.Exclamation = NO # replaced by Fly.Exclamation -Google.Gender = NO # we don't refer to gender in docs -Google.GenderBias = NO # we don't refer to gender in docs -Google.Headings = NO # replaced by Fly.Headings -Google.Latin = NO # replaced by Fly.Latin -Google.OxfordComma = NO # replaced by Fly.OxfordComma -Google.Parens = NO # triggered by links so not useful right now -Google.Passive = NO # duplicate of write-good.Passive -Google.Quotes = NO # too many false positives -Google.Semicolons = NO # don't need this -Google.Spacing = NO # extra spaces aren't rendered anyway -Google.Units = NO # we don't care about unit spacing right now -Google.We = NO # we are OK with "we" sometimes -Google.Will = NO # TBD whether to use this or not -Google.WordList = NO # replaced by Fly.WordList - -# Write good styles turned off permanently -write-good.Cliches = NO # duplicate of proselint.Cliches -write-good.E-Prime = NO # too bossy and weird -write-good.Weasel = NO # too arbitrary - -# Vale.Avoid = NO -Vale.Repetition = NO # replaced by good-write.Illusions which has an adjustable error level -Vale.Spelling = NO # replaced by Fly.Spelling -Vale.Terms = NO # noisy false positives: enforces vocab-term casing even inside code, and prints raw regex vocab entries as suggested fixes +[api/machines/models.mdx] +BasedOnStyles = [formats] markerb = md # maps our markerb file extension to md for linting diff --git a/styles/Fly/WordList.yml b/styles/Fly/WordList.yml index 7f618286d8..f67578642d 100644 --- a/styles/Fly/WordList.yml +++ b/styles/Fly/WordList.yml @@ -18,19 +18,16 @@ swap: # below: later|in the following steps check box: checkbox click on: click|click in - data are: data is datatype: data type datastore: data store # filesystem: file system firewalls: firewall rules - free tier: free allowances functionality: capability|feature healthcheck: health check healthchecks: health checks HTTPs: HTTPS in order to: to # instance: Machine - k8s: Kubernetes leverage: use Nodejs: Node.js open-source: open source From fb1ae038a1212d212db3c6878d79b3bd0aa6eb90 Mon Sep 17 00:00:00 2001 From: Kristin Martin Date: Thu, 22 Oct 2026 18:12:13 +0000 Subject: [PATCH 2/2] Fix a doubled word and a wordy phrase in two blueprints --- blueprints/shared-nothing.mdx | 2 +- blueprints/staging-prod-isolation.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blueprints/shared-nothing.mdx b/blueprints/shared-nothing.mdx index 9142ae5f49..c5d5d2f0f8 100644 --- a/blueprints/shared-nothing.mdx +++ b/blueprints/shared-nothing.mdx @@ -347,7 +347,7 @@ costs for a typical month are around \$0.03. So we are up to \$67.71. Next up volumes. I have 9 machines with 3GB disks, and 2 machines that only need 1G each. 29GB at \$0.15 per month is \$4.35. -I have a dedicated IPv4 address in order to use ssh. This adds \$2.00 per month. +I have a dedicated IPv4 address to use ssh. This adds \$2.00 per month. Outbound transfer is well under the free allowance, but for completeness I'm seeing about 16GB in North America and Europe, which at \$0.02 per GB amounts to \$0.32. And about 0.1GB in Asia Pacific, which at \$0.04 per GB adds less than a cent, diff --git a/blueprints/staging-prod-isolation.mdx b/blueprints/staging-prod-isolation.mdx index 3720f88d95..60c1929d0e 100644 --- a/blueprints/staging-prod-isolation.mdx +++ b/blueprints/staging-prod-isolation.mdx @@ -14,7 +14,7 @@ All Fly.io accounts start with a "personal" organization. You can create as many Before you create a new organization, here's what you need to know: -- You can consolidate billing for multiple organizations under a a single parent organization, or you can create regular organizations with separate payment methods and billing. Learn more about [unified billing](/about/billing#unified-billing). +- You can consolidate billing for multiple organizations under a single parent organization, or you can create regular organizations with separate payment methods and billing. Learn more about [unified billing](/about/billing#unified-billing). - You invite or remove members in each organization separately. - An organization can have multiple apps and those apps can communicate with each other securely over the org's private network.