Skip to content

Commit c936be1

Browse files
Zenofexclaude
andauthored
Stop telling people to visit a URL that 404s (#14)
Every "get an API key" message pointed at `https://bootintel.com/settings/api-keys`. **That page does not exist and never has** — there is no `/settings` route on the site at all. Keys live at `/dashboard/developer`. Six places said otherwise: `doctor`, `whoami` (twice), `scan --api` (twice), and `analyze --api`. It surfaced because someone ran `bootintel doctor` on a Mac and pasted the output. That line had been wrong for as long as it existed, and no test could have caught it: it is a string, and the route it names lives in a different repo. The advice was also stale in a way introduced by the login work. API-key auth is gated at Pro, so for anyone below that tier the instruction was not just a broken link but the wrong action. These messages now recommend `bootintel login` first, which is the path for a person at a terminal, and mention API keys as the CI and scripting option they are. Tests, clippy under `-D warnings`, and rustfmt all clean. --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent a76ae4f commit c936be1

6 files changed

Lines changed: 22 additions & 7 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,18 @@ All notable changes to bootintel-cli are documented here. Format follows [Keep a
88

99
## [Unreleased]
1010

11+
### Fixed
12+
- **Every "get an API key" message pointed at a URL that 404s.**
13+
`https://bootintel.com/settings/api-keys` does not exist and never has;
14+
there is no `/settings` route at all. Keys live at `/dashboard/developer`.
15+
Six places said otherwise: `doctor`, `whoami` twice, `scan --api` twice, and
16+
`analyze --api`. Surfaced by running `bootintel doctor` on a Mac, which is
17+
the first time anyone read that line back.
18+
- The same messages are now correct about what to do, not just where to go.
19+
`bootintel login` is the path for a person at a terminal and the only one
20+
that works below Pro, since API-key auth is Pro-gated. They recommend it
21+
first and mention keys as the CI and scripting option.
22+
1123
## [0.6.0] — 2026-09-27 — applicability without sending the log
1224

1325
New flag, no breaking change, so MINOR per the policy above.

‎crates/cli/src/api/client.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ impl ScanError {
291291
"quota exhausted — see https://bootintel.com/pricing, or fall back to client-side `bootintel scan` (no --api)",
292292
),
293293
ScanError::Unauthorized { .. } => Some(
294-
"check $BOOTINTEL_API_KEY, or regenerate at https://bootintel.com/settings/api-keys",
294+
"run `bootintel login` again, or regenerate a key at https://bootintel.com/dashboard/developer",
295295
),
296296
ScanError::BadRequest { .. } => Some(
297297
"common causes: log > 256KB (server limit), or the file isn't a boot log",

‎crates/cli/src/cmd/analyze.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ fn build_api_config(args: &Args) -> Result<Option<ApiConfig>> {
267267
let api_key = crate::config::resolve_api_key();
268268
if !args.preview && api_key.is_none() {
269269
bail!(
270-
"--api requires ${API_KEY_ENV} to be set (or use --api --preview for the free anonymous quota — 3/day per IP).\n Get a key at https://bootintel.com/settings/api-keys"
270+
"--api needs credentials. Run `bootintel login` to sign in from this terminal,\n or `--api --preview` for the free anonymous quota (3/day per IP).\n For CI and scripting, set ${API_KEY_ENV} to a key from https://bootintel.com/dashboard/developer (Pro and above)"
271271
);
272272
}
273273
// Same plaintext-transport policy as `scan` — shared helper in

‎crates/cli/src/cmd/doctor.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ fn check_api_key() -> Check {
233233
_ => Check {
234234
name: "$BOOTINTEL_API_KEY",
235235
status: Status::Warn,
236-
detail: "unset — --api will need --preview (anonymous, 3/day per IP).\nGet a key at https://bootintel.com/settings/api-keys".into(),
236+
detail: "unset. Run `bootintel login` to sign in from this terminal.\nOr `--api --preview` for the anonymous quota, no account needed.\nAn API key (Pro and above, for CI and scripting) comes from https://bootintel.com/dashboard/developer".into(),
237237
},
238238
}
239239
}

‎crates/cli/src/cmd/scan/api.rs‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub(super) fn run_api(args: &Args, raw: &str) -> Result<()> {
2525

2626
if !args.preview && api_key.is_none() {
2727
bail!(
28-
"--api requires ${API_KEY_ENV} to be set (or use --api --preview for the free anonymous quota — 3/day per IP).\n Get a key at https://bootintel.com/settings/api-keys"
28+
"--api needs credentials. Run `bootintel login` to sign in from this terminal,\n or `--api --preview` for the free anonymous quota (3/day per IP).\n For CI and scripting, an API key (Pro and above) comes from https://bootintel.com/dashboard/developer"
2929
);
3030
}
3131
if args.preview && api_key.is_some() {
@@ -177,7 +177,10 @@ pub(super) fn render_api_error(err: ScanError, preview: bool) -> Result<()> {
177177
}
178178
writeln!(e)?;
179179
writeln!(e, " Check that {API_KEY_ENV} is set to a valid key.")?;
180-
writeln!(e, " Manage keys: https://bootintel.com/settings/api-keys")?;
180+
writeln!(
181+
e,
182+
" Manage keys: https://bootintel.com/dashboard/developer"
183+
)?;
181184
}
182185
ScanError::BadRequest { detail } => {
183186
writeln!(e, "bootintel: server rejected the request.")?;

‎crates/cli/src/cmd/whoami.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ pub fn run(args: Args) -> Result<()> {
9595
Some(k) => k,
9696
None => {
9797
eprintln!(
98-
"no API key found — set $BOOTINTEL_API_KEY, or `bootintel config set api_key bik_...`\n Get a key at https://bootintel.com/settings/api-keys"
98+
"not signed in. Run `bootintel login` to sign in from this terminal.\n For CI and scripting, an API key (Pro and above) comes from https://bootintel.com/dashboard/developer"
9999
);
100100
std::process::exit(EX_NOPERM);
101101
}
@@ -114,7 +114,7 @@ pub fn run(args: Args) -> Result<()> {
114114
Err(ProbeError::Unauthorized) => {
115115
eprintln!("unauthorized — API key rejected by {base}");
116116
eprintln!(
117-
" regenerate at https://bootintel.com/settings/api-keys or check $BOOTINTEL_API_KEY"
117+
" run `bootintel login` again, or regenerate a key at https://bootintel.com/dashboard/developer"
118118
);
119119
std::process::exit(EX_NOPERM);
120120
}

0 commit comments

Comments
 (0)