Troubleshooting

What a message means, and what to do about it. Most problems come down to a key, a budget or a sign-in setting.

What a message means, and what to do about it. Most problems come down to a key, a budget or a sign-in setting. Where a message names something specific (a story, a company, a date), only its fixed words are shown here.

Signing in

“This account isn’t invited yet”

Sign-in page, careerbot.dev

The hosted version is invite-only. Sign in with the Google or GitHub account for the email you were invited with, or join the waitlist.

“This invite has expired”

Invite link, careerbot.dev

Invites last 14 days. Ask the person who invited you for a new link. Already signed up? Sign in with the account you used.

“This invite was withdrawn”

Invite link, careerbot.dev

The invite no longer lets anyone sign up. Ask the person who invited you.

“This invite link doesn’t work”

Invite link, careerbot.dev

A newer link replaced it. Ask for the latest one.

“That isn’t the invited account”

Invite link, careerbot.dev

Choose Try another account and sign in with the Google or GitHub account for the invited email.

“This account is suspended”

Sign-in page, careerbot.dev

Write to the address on the page if you think that's a mistake.

“This account can’t sign in to this copy. Ask its owner to add you.”

Sign-in page, a copy someone runs

This copy only lets in the people its owner adds, or emails on its list for Google and GitHub sign-in. Ask the owner.

“No way to sign in is set up. Add Google or GitHub sign-in keys to this copy’s Convex settings.”

Sign-in page

This copy has no Google or GitHub sign-in yet. Add AUTH_GOOGLE_ID and AUTH_GOOGLE_SECRET, or AUTH_GITHUB_ID and AUTH_GITHUB_SECRET, then run docker compose up -d again. See Keys and accounts.

“Sign-in didn’t work. Try again.”

Sign-in page

Google or GitHub didn't finish signing you in. Try again; if it keeps happening on your own copy, check the OAuth app's callback URL against .env.example.

“That username and password don’t match. Try again, or reset your password.”

Sign-in page, a copy you run

Check the username (it's lower case) and password. Forgot password? shows the command that sets a new one.

“Too many wrong passwords for this username. Wait a few minutes and try again, or reset your password.”

Sign-in page, a copy you run

Each account allows 10 wrong tries an hour. Wait, or reset the password with the command under Forgot password?.

“You signed in with a temporary password. Choose your own to carry on.”

Sign-in page, a copy you run

The owner added you, or reset your password. Choose a new password; the temporary one stops working.

“Choose a password that isn’t the one you have now.”

Choosing a new password

Pick a different password.

“The passwords don’t match.”

Choosing a password

Type the same password in both fields.

“At least 8 characters.”

Choosing a password

Passwords need 8 characters or more.

“2 to 32 letters, digits, dots, dashes or underscores, starting with a letter or digit.”

Choosing a username

Usernames are lower case, 2 to 32 characters, with no spaces.

Setting up your own copy

“That setup code doesn’t work. Check it in the install’s output, or make a new one.”

Creating the owner account

Copy the setup code again from the convex-setup service's output, or make a new one with docker compose run --rm convex-setup new-setup-code. Only the newest code works.

“That setup code was tried wrongly too many times and no longer works. Make a new one with the command below.”

Creating the owner account

Run docker compose run --rm convex-setup new-setup-code and use the new code.

“This copy already has its owner. Sign in instead.”

Creating the owner account

The owner account exists. Sign in with it; if the password is lost, run docker compose run --rm convex-setup reset-password <username>.

“Username and password sign-in is off on this copy.”

Sign-in page

This Convex deployment isn't running as a self-hosted copy. Set CAREERBOT_MODE=self-hosted in its environment.

“This copy’s Convex isn’t set up for username and password sign-in: set CAREERBOT_MODE=self-hosted in its environment.”

Sign-in page

The same fix: set CAREERBOT_MODE=self-hosted in the Convex deployment's environment variables.

See Sign-in and who can join for setup codes, password resets and adding people.

AI and budgets

“Add your OpenRouter key in settings first.”

Anywhere AI runs

Open Settings, then Keys, and add your OpenRouter key. A new key is checked before it replaces the old one.

“OpenRouter didn't accept that key.”

Settings, Connections

Copy the key again from OpenRouter, whole, and check it hasn't been revoked.

“Set a monthly AI budget to continue.”

Anywhere AI runs

Open Settings, then Budgets and spending, and set an AI budget. No AI work runs without one.

“This month's AI budget is used up.”

Anywhere AI runs

Work pauses. It picks up where it left off when you raise the budget, or on the 1st of the month (UTC).

“This call could cost more than what's left of this month's AI budget.”

Anywhere AI runs

CareerBot reserves what a call could cost before it runs. Raise the budget, or wait for the new month.

“Waiting on AI work already running, which could use the rest of this month's AI budget.”

Activity

Other work has reserved the rest of the budget. This continues on its own once that work finishes and leaves room.

“Waiting on earlier AI work to be settled tonight, which could use the rest of this month's AI budget.”

Activity

Earlier calls that were cut off, or didn't say what they cost, still hold part of the budget until the nightly check works out what they cost. This continues on its own after that check, or when you raise the budget.

“Paused until your AI budget allows”

Activity

Not a failure. It continues on its own once the budget allows.

“Choose a model for”

Anywhere AI runs

The message names a task with no model. In Settings, under AI, choose the model every task uses, or one for that task.

“Couldn’t load models from OpenRouter.”

Settings, AI

OpenRouter didn't answer. Try again in a minute. The models you've already chosen stay chosen.

“Couldn't load the model list from OpenRouter.”

Settings, AI

The same: OpenRouter didn't answer. Try again in a minute.

“Couldn’t reach OpenRouter”

Activity

The test call failed. Check your key under Keys, then ask a question under Try it in Settings, AI, again.

Companies and roles

“Paused until your Apollo budget allows”

Activity

Apollo work stopped at the credits you set aside. In Budgets and spending, raise them, or set Automated Apollo work to Only when I ask.

“You've used the Apollo credits you set aside this cycle.”

Companies

Raise the credits set aside in Budgets and spending, or wait for the next cycle.

“Your Apollo account doesn't have enough credits left this cycle.”

Companies

Your Apollo account itself is nearly empty. CareerBot never spends past its balance. Add credits at Apollo, or wait for its next cycle.

“Apollo work is paused. Turn it on in Budgets.”

Companies

Automated Apollo work is set to Paused. Set it to On or Only when I ask.

“Automated Apollo work is off.”

Activity

Automated Apollo work is set to Only when I ask, so work that would start on its own doesn't use Apollo. Start it yourself, or set it to On.

“Couldn't read your Apollo credit balance, so nothing was spent.”

Companies

Apollo didn't answer. Try again in a few minutes.

“Couldn’t read your Apollo credits, so none will be spent.”

Settings, Connections

The same: Apollo's balance couldn't be read just now. Apollo work waits until it can be.

“Apollo didn't accept that key, or it can't read your credit usage.”

Settings, Connections

Use a master key, or a key with access to credit usage stats, company search and organization enrichment.

“Approve a direction’s search criteria first.”

Companies

Company search runs per direction. In Goals, open a direction and approve its criteria.

“The last search stopped.”

Companies

A company search ended early. The reason shows instead when there is one. Run the search again; what it already finished isn't paid for twice.

“Couldn’t read its board”

A company's details

CareerBot couldn't read that company's job board on the date shown. Check the board link with Edit website and job board, or choose Check again.

“CareerBot can't read that kind of job board yet.”

Editing a job board

Paste the board's own page, such as a Lever or Workday address, rather than a careers page.

“CareerBot doesn't read SmartRecruiters boards”

Editing a job board

SmartRecruiters and Teamtailor ask automated readers not to read their boards, so CareerBot leaves them alone. Turning on Job postings from Apollo may still bring in the company's roles.

“Use the company's website, like nvidia.com.”

Editing a website

Enter the company's own domain, not a link to a job site or profile.

“Roles are read for Targets and Maybe companies. Rate it first.”

Companies

Rate the company Target or Maybe, then check its roles.

“Couldn’t check roles”

Activity

The roles pass stopped. The reason is under it. Choose Check roles again in Pursuits once it's fixed.

Google Drive

“Not available yet”

Settings, Connections

Connect stays off until this copy has Google sign-in set up (AUTH_GOOGLE_ID and AUTH_GOOGLE_SECRET).

“Google Drive didn’t connect. Try again.”

Settings, Connections

Connect again, and allow access when Google asks.

“This connection was started from another account. Start it again here.”

Settings, Connections; Today

Someone else's link was used, or you're signed in to a different account than the one that started connecting. Nothing was connected. Choose Connect Google Drive here.

“This connection took too long to finish. Start it again here.”

Settings, Connections; Today

Connecting wasn't finished within a few minutes, or the link was already used. Connect again.

“Google Drive isn’t connected: CareerBot needs access to the files it makes.”

Settings, Connections

Access wasn't allowed. Connect again and allow it; CareerBot sees only the files it makes and the folder you choose.

“Google Drive stopped accepting CareerBot. Connect it again.”

Settings, Connections

Access was removed in your Google account. Connect again.

“Google’s folder picker didn’t load. Try again.”

Settings, Connections

Try again. On your own copy, the folder picker also needs GOOGLE_PICKER_KEY.

“That’s your CareerBot folder or one inside it. Choose a folder outside it.”

Choosing a Drive folder

Pick the folder the CareerBot folder should go in, not the CareerBot folder itself.

“Your Google Drive is full.”

A document's Drive status

Free up space in Drive, then try again.

“Google Drive asked CareerBot to slow down. Try again in a minute.”

A document's Drive status

Wait a minute, then choose Try again. Changes sync soon after they're made, with a daily check as a safety net.

“CareerBot can’t reach this in your Drive anymore.”

A document's Drive status

The Doc was deleted or moved out of reach. Syncing again makes it again.

GitHub

“Not available yet”

Record, Projects

Connect GitHub stays off until this copy has its GitHub App set up.

“This connection was started from another account. Start it again here.”

Record, Projects

Someone else's link was used, or you're signed in to a different account than the one that started connecting. Nothing was connected. Choose Connect GitHub here.

“This connection took too long to finish. Start it again here.”

Record, Projects

Connecting wasn't finished within a few minutes, or the link was already used. Connect again.

“GitHub isn’t connected any more. Connect it again in Projects.”

Record, Projects

The app was uninstalled in GitHub. Connect GitHub again.

“CareerBot can’t see that repository. Choose it on GitHub, then read it again.”

A project

The repository isn't among the ones you allowed. Choose it with Choose repositories, then Read again.

“GitHub refused access. Try again.”

A project

Try again in a minute; if it keeps happening, connect GitHub again.

“GitHub didn’t list your repositories. Try again.”

Record, Projects

Try again in a minute.

Background work

Work running in the background is listed in Activity. When something fails, it says what failed and the reason under it. Try again starts it again where Activity offers it.

“Waiting to start”

Activity

It's queued behind other work and starts on its own.

“This kept getting interrupted. Try again.”

Activity

The work was cut off three times, by an update or a crash. Choose Try again.

Running your own copy

“Set NEXT_PUBLIC_CONVEX_URL in .env”

docker compose up

Copy .env.example to .env and fill it in; NEXT_PUBLIC_CONVEX_URL is your Convex address (http://localhost:3210 on your own computer).

“Set NEXT_PUBLIC_CONVEX_URL to your Convex deployment URL (see .env.example).”

The web container's log

The web container started without a Convex address. Set it in .env and run docker compose up -d again.

“Set CONVEX_DEPLOY_KEY (Convex's cloud) or CONVEX_SELF_HOSTED_URL (self-hosted Convex); see .env.example.”

The convex-setup service's log

Setup doesn't know which Convex to use. Set one of the two in .env.

“Set CONVEX_SELF_HOSTED_ADMIN_KEY”

The convex-setup service's log

Make the admin key with docker compose exec convex-backend ./generate_admin_key.sh and put it in .env.

“NEXT_PUBLIC_CONVEX_URL and SITE_URL can't contain”

The web container's log

Those two addresses can't contain the characters it lists. Use a plain address.

“This container already serves”

The web container's log

The web container keeps the addresses it first started with. Recreate it to change them: docker compose up -d does.

“MASTER_KEY_V1 is missing or malformed.”

Saving a key in Settings

The key that encrypts saved API keys isn't set in the Convex deployment. Run the convex-setup service again (docker compose up), which makes it. If you bring one from another copy, it's 64 hexadecimal characters.

A port is already in use

If docker compose up stops with Docker's own error that a port "is already allocated", something else on the computer already uses that port (3000 for the app, 3210 and 3211 for Convex, 6791 for the Convex dashboard). Stop the other program, or set WEB_PORT, CONVEX_PORT, CONVEX_SITE_PORT or CONVEX_DASHBOARD_PORT in .env to a free port, then change SITE_URL, NEXT_PUBLIC_CONVEX_URL or CONVEX_SITE_ORIGIN to match when they're localhost addresses. On Dokploy, whose own dashboard uses 3000, set WEB_PORT=3001 or another free port.

See Check it works for a full check of a new copy.

Edit this page on GitHub