Setup

Troubleshooting

Symptom-first fixes for pairing, recipes, AI routing, connections, backup and restore, and updates.

Symptom-first entries for the failures people actually hit. Every fix keeps the same shape: what you see, why it happens, what to do.

#Pairing and clients

Pairing fails in the browser on a LAN address. Browsers restrict the cryptography pairing needs to secure contexts, so http://192.168.x.x fails by design. Pair over HTTPS, or over localhost on the server machine itself. See Reachability.

A new pairing code is rejected immediately. Use the code from the active server process's boot log. Pairing codes live in memory, so a code generated by a separate command process is not attached to the server handling the request. If the boot code is more than 15 minutes old, restart the server with the same database and configuration and use the replacement code.

The webclient looks signed in but nothing loads. The client renders its last known state even when the server is unreachable — after a server restart or network change, give it a moment, then reload; if it still stalls, check that the server is running and reachable.

A recipe that watches or touches a live page refuses to run. DOM triggers, page reads, and page actions need a paired Browser Bridge; the recipe says so before running rather than failing midway. Pair a Bridge, or leave that recipe for a machine that has one.

#Recipes and automation

A reactive recipe stopped firing. After repeated consecutive failures the circuit breaker disables the recipe and notifies you — this is deliberate. Fix the cause (a missing connection, an unresolvable AI step), then re-enable it; it never re-enables itself.

A watcher seems to do nothing. Quiet ticks are silent by design: when a trigger step returns should_run: false, the tick leaves no audit entry and no output. Silence means "nothing matched", not "broken".

A condition never matches. The most common cause is a quoted literal: equal 'closed_won' compares against the quotes and never matches. Literals in condition strings are always bare — equal closed_won.

A guard halts a run you expected to pass. A guard halts when its condition is met"guard": "{{step.deal}} is_null" stops the run when the deal is missing. Read it as "stop if", not "require that".

#AI

An AI step fails before the recipe starts. Preflight matched every AI step against your configured sources and found no fit. Each unavailable source has a reason — no key, quota exhausted, disabled, or incompatible with the requested capability — and the fix is in Settings → AI/Models: add a source, or relax the step's requirement.

An embedding producer says no embeddings model is configured. Normal AI sources do not satisfy vector work. Configure the dedicated slot under Settings → AI/Models → Providers → Embeddings. Embedding calls use only that slot; they do not fall back to the free pool or the fast and quality slots.

Background enrichment never runs. Three switches gate it: the topic's trust level (off or manual stays off or manual — nothing promotes itself), the global Pause-AI window, and the topic's pool policy (free-only stalls when the free pool is exhausted). Check them in that order.

#Connections and vendors

A vendor capability shows "disabled" after enrollment. The provider granted less than the pack needs — a missing HubSpot scope, or a Salesforce object the user profile cannot see. Re-grant in your own vendor app (or adjust the Salesforce profile) and re-enroll; the warning names what is missing.

CRM data lags behind the vendor. Without a public URL your server cannot receive vendor webhooks, so it falls back to periodic reconciliation — the data arrives, on the reconciliation cadence. Give the server a public name to get event-speed freshness; Salesforce is the exception, since its streaming subscription is outbound and works without one.

A connection keeps failing after working for months. One automatic token refresh is attempted on an auth failure. If failures persist, the grant itself has likely been revoked or expired at the provider — re-enroll the connection under the same name and dependent recipes resume unchanged.

A recipe reports its connection is not bound. The recipe's connection picker was never given a concrete connection on this install. Open the recipe's configuration and select one; enroll one first if the list is empty.

#Backup and restore

Restore refuses with "target not empty". The pre-pair restore path only targets fresh servers, deliberately — it will not overwrite a server that already has data. On a server in use, restore from Settings → Backup & Recovery instead, which applies its own guards.

Restore refuses with "archive too new". The archive was exported by a newer server version than the one restoring. Update the server first, then restore; the reverse direction (older archive, newer server) migrates forward automatically.

Wrong recovery key during restore. It bounces cleanly: nothing is committed, the server stays pristine, and the corrected re-submit resumes without re-uploading the archive.

The server did not come back after a restore. The commit ends in a restart. Supervised installs — containers, the one-click image, a service manager — respawn automatically; a server running in a plain foreground terminal needs starting again by hand.

#Updates

An update appeared to apply, then the old version is running. The boot health check failed and the server reverted automatically — that is the safety working, not a failed rollback. Check the server logs for what broke before retrying; the attempt is recorded in the update ledger.

Recued is local first; your server remains the authority.

Recued Docs

Search documentation

Start typing to search the documentation.