🔗 docs: Repair Dead Docs Routes and Close Verified Reference Gaps - #751
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
📦 Next.js Bundle Analysis for librechat.aiThis analysis was generated by the Next.js Bundle Analysis action. 🤖 This PR introduced no changes to the JavaScript bundle! 🙌 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 65d9202a7e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2d6c67db73
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
📦 Next.js Bundle Analysis for librechat.aiThis analysis was generated by the Next.js Bundle Analysis action. 🤖 This PR introduced no changes to the JavaScript bundle! 🙌 |
1 similar comment
📦 Next.js Bundle Analysis for librechat.aiThis analysis was generated by the Next.js Bundle Analysis action. 🤖 This PR introduced no changes to the JavaScript bundle! 🙌 |
… real pages The Object Structure card on the librechat.yaml page linked to /docs/configuration/librechat_yaml/object_structure, a nav-only folder with no index page, so the one card promising the "complete field reference" 404'd. Point it at the Config Structure page the section actually opens with, and redirect the folder URL there for anyone who typed or bookmarked it. The legacy /toolkit redirects pointed one dead spelling at another (/toolkit/yaml_checker -> /toolkit/yaml-checker); neither exists since the toolkit moved under /docs/toolkit. In-page links survive because lib/localize-href.ts canonicalizes them at render time, so this only bit direct hits, including the one absolute toolkit URL in the Linux guide that skipped canonicalization for being external-shaped. Redirect targets now match the canonical map in localize-href.ts. Feedback: 1531982915729359019, 1491241561986564299
… values
The speechTab section showed an example with eleven keys and explained
none of them. Add the field reference from the schema: accepted engine
values for STT and TTS, and the two settings whose meaning is not
guessable: decibelValue is a silence threshold in dB (-100 to -30,
default -45) and autoSendText is a delay in seconds where -1 disables
auto-send.
Neither speech page mentioned allowedAddresses, though speech.stt and
speech.tts both take one and every self-hosted example we ship
(host.docker.internal, localhost) is inside the private address space the
connect-time guard blocks.
defaultParamsEndpoint is z.string().default('custom'), not an enum, and
the page only showed 'google' as an example. The panel resolves it via
paramSettings[key] ?? [], so an unrecognized value passes validation and
renders an empty parameter panel instead of reporting an error. List the
keys that resolve and describe that failure mode.
Feedback: 1543536529195012169, 1506499310035140753
…nshot The Ollama reports were about diagnosis rather than the sample config. Add the checks that resolve most failures: container-vs-host baseURL, Ollama's default 127.0.0.1 bind, and the name-prefix rule behind model fetching: models.ts reaches for /api/tags first only when the endpoint name starts with "ollama". Also note that a remote or hosted server differs only in baseURL and apiKey. The stop-sequence screenshot had "image" as its alt text and no caption saying which panel it shows. Feedback: 1539423034283393146, 1529194857564995645, 1528452749685952575
…arch Banner: update-banner does findOne() then findByIdAndUpdate, so there is only ever one banner and running it again overwrites the previous message and schedule. Two overlapping windows are therefore not possible, and delete-banner is the only way to take one down early. Import Conversations: the "Export your conversations" heading covered exporting *from* ChatGPT and Claude, so readers looking for LibreChat's own export found the wrong thing. Rename that section and document the real export flow, its five formats, and the branch and option rules that vary by format. Message Search: say plainly that conversation search is keyword-based and that semantic retrieval applies to uploaded files through the RAG API, rather than leaving readers to infer it from "Meilisearch". Transactions: the setting only controls whether records are written, which is why enabling it does not make token counts appear anywhere. Point at interface.contextUsage and contextCost for the display. Feedback: 1494744632884596746, 1528752311281647727, 1508348821095059487, 1508345688273191073, 1522687279234289807
#699 removed the pasted video description from artifacts.mdx but the same boilerplate survived on two other feature pages: a trailing hashtag line on agents.mdx (plus the horizontal rule left orphaned above it) and on code_interpreter.mdx. Both had already been machine-translated into every locale. Feedback: 1532228462868168886
The Auth0 SAML guide told readers to copy Auth0's Issuer into SAML_ISSUER, and its example set it to `urn:dev-xxxxx.us.auth0.com`. That is backwards. samlStrategy.js:315 passes SAML_ISSUER as the strategy's `issuer`, which is the entity ID LibreChat asserts about *itself* in outbound AuthnRequests and must match the Audience configured on the Auth0 side. The identity provider's own issuer belongs in SAML_IDP_ISSUER, used at samlStrategy.js:185 to verify incoming assertions. Following the page as written produced a mismatched audience on both sides. Also states that LibreChat publishes no SP metadata document, which is what the reporter went looking for, and fixes three typos on the lines touched. Feedback: 1486774904136269884
Seven reports say a provider never showed up after following the guide, and the troubleshooting advice was to check the logs. That advice is misleading: loadCustomEndpointsConfig (packages/api/src/endpoints/custom/config.ts:21-28) filters out any endpoint missing `name`, `baseURL`, `apiKey` or `models`, or whose `models` has neither `fetch: true` nor a non-empty `default`, and the filter emits nothing at all. A typo or a mis-indented block therefore removes the endpoint while the logs stay clean. Rewrites the "Not Seeing Your Endpoint?" callout around inspecting the block itself, notes that a duplicate name silently replaces the earlier entry, and that a schema error anywhere in librechat.yaml stops the server rather than disabling one section. Gives groq.mdx the enablement steps it never had: its example uses `fetch: false`, so its `models.default` list is load-bearing in exactly the way the filter punishes. Also extends defaultParamsEndpoint with the four values that resolve during schema lookup (parsers.ts:38-50) but map to no renderable parameter set. Feedback: 1528641958187106465, 1477743384113447032, 1526344941800919159, 1477745639617073208, 1507234635573104813, 1481873299515506808
/docs/local: the desktop-installer callout added by #600 only ever landed on /docs, and /docs/local is the page the "where's the Windows installer" report was actually filed against. It rendered as a bare install-options grid with nothing saying LibreChat is not a downloadable app. pre_configured_ai/openai: `user_provided` was mentioned with no explanation of what users then do. Documents the Set API Key gear in the endpoint menu, the expiry choices (30m/2h/12h default/1d/7d/30d/never), that the key is encrypted per user server-side, and the revoke path. features/authentication: no mention of session length, so "I keep getting logged out" had nowhere to land. Adds the SESSION_EXPIRY (15m) and REFRESH_TOKEN_EXPIRY (7d) defaults, explains that the short token renews silently, and states plainly that there is no anonymous mode. cdn/s3: S3_REFRESH_EXPIRY_MS was the one env var the storage code reads that the page never listed. Feedback: 1496108363296018513, 1488860965666816060, 1500577570784149656, 1517360828762947625, 1482888861599399978
The Azure page described the service but never what LibreChat stores in it, which was the reported complaint. Storage strategy is not a feature toggle: it decides where avatars, chat uploads, image-generation output, and Code Interpreter files all go. Names those consumers and the reason to move off the default local disk, which does not survive container recreation and cannot be shared across replicas. Feedback: 1512086950859767868
…vior autoSendText is seconds, not milliseconds, and -1 is what disables auto-send; 0 sends immediately. autoTranscribeAudio controls continuous listening (and silence detection on external engines), not transcription of audio messages. The reference table and the STT/TTS guide disagreed with each other and both disagreed with the client. Also note that privately resolved cloud endpoints are not exempt from the SSRF guard, and that browser TTS voices come from the OS rather than a configured voice list.
- Drop the Groq enable-the-endpoint section; the custom endpoints guide already covers it. - contextUsage draws the gauge and is on by default; contextCost only adds pricing and is off by default. Don't present both as required. - An account is required to chat, but ALLOW_SHARED_LINKS_PUBLIC lets anonymous visitors read a shared conversation. - defaultParamsEndpoint is filled in from provider when omitted, so 'custom' is not the effective default for a provider-backed endpoint. - Warn that OLLAMA_HOST=0.0.0.0 exposes an unauthenticated API on every interface, and explain that apiKey is only the Bearer fallback. - Replace double hyphens used as pauses.
92d12cf to
2447073
Compare
|
Addressed every review finding. Rebased onto current Review comments
Codex findings Two of these were reported as conflicts between this PR and the canonical
The rest I confirmed and fixed as reported:
Validation
|
📦 Next.js Bundle Analysis for librechat.aiThis analysis was generated by the Next.js Bundle Analysis action. 🤖 This PR introduced no changes to the JavaScript bundle! 🙌 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2447073ce8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…paths - Compose bind-mounts ./images and ./uploads to the host, so local file storage is not lost when the API container is recreated. Scope the warning to multi-instance and no-persistent-volume deployments. - A renamed Ollama endpoint does not come back with an empty model list. The native /api/tags call is tried only for names starting with ollama, but any other name, or a failure, falls through to /v1/models, which Ollama serves at the documented /v1/ base URL. - Auth0's Settings JSON needs an audience matching SAML_ISSUER, otherwise Auth0 asserts its default audience and login fails on a mismatch. - Provider keys can also be set from Settings, Data controls, API keys, which is the only path when a model spec hides the endpoint menu.
|
Second round of Codex findings addressed. All four were correct.
|
📦 Next.js Bundle Analysis for librechat.aiThis analysis was generated by the Next.js Bundle Analysis action. 🤖 This PR introduced no changes to the JavaScript bundle! 🙌 |
7d786ea to
3cfa883
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3cfa883959
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
📦 Next.js Bundle Analysis for librechat.aiThis analysis was generated by the Next.js Bundle Analysis action. 🤖 This PR introduced no changes to the JavaScript bundle! 🙌 |
…cale The next.config redirect only covers the unprefixed URL. Translated index pages still carry the nav-only folder as the Object Structure card target, and TrackedLink prefixes it with the active locale, so the card stayed a 404 for all thirteen non-English readers. Canonicalize the path in localize-href alongside the legacy /toolkit aliases, which happens before locale prefixing and so fixes every locale at render time. Verified against a production server: no locale emits the bare folder href any more. Also note that a refresh inherits the session's original expiry rather than restarting it, so REFRESH_TOKEN_EXPIRY is measured from login.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 722c276777
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
📦 Next.js Bundle Analysis for librechat.aiThis analysis was generated by the Next.js Bundle Analysis action. 🤖 This PR introduced no changes to the JavaScript bundle! 🙌 |
With OPENID_REUSE_TOKENS=true the refresh cookie holds the provider's token, so the IdP's lifetime, rotation, and revocation policy end the session and raising REFRESH_TOKEN_EXPIRY cannot extend it.
📦 Next.js Bundle Analysis for librechat.aiThis analysis was generated by the Next.js Bundle Analysis action. 🤖 This PR introduced no changes to the JavaScript bundle! 🙌 |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c12abdf58f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The page's primary example already uses fetch: true, and models.ts has a dedicated Ollama fetch path, so the two examples in the stop-sequence callout contradicted the rest of the page. Say why the list is pinned instead, and let the hosted-proxy example fetch, which is the point of the /v1/models fallback described above it.
📦 Next.js Bundle Analysis for librechat.aiThis analysis was generated by the Next.js Bundle Analysis action. 🤖 This PR introduced no changes to the JavaScript bundle! 🙌 |
|
@codex review |
|
Codex Review: Didn't find any major issues. Keep it up! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Summary
Processes the pending Discord docs-feedback backlog (256 items). Most of it was already answered by the June docs overhaul (#530, #600, #660) and by changes that landed on
mainthis week, so this PR is deliberately small: it fixes the reports that survived verification against the current repository and the current LibreChat schema.Two of these are real broken routes. The rest are cases where the documented behaviour was verifiable from
packages/data-provider/src/config.tsand the app source, and the page simply did not say it.Every factual claim added here is taken from LibreChat
origin/devat the time of writing, cited in the commit messages. Where a claim could not be verified from source it was left out rather than guessed: the SearXNG instance-URL request path and the reported DeepSeek model deprecation are both noted as unverified below rather than written into the docs.Feedback addressed
1531982915729359019,1491241561986564299:/docs/configuration/librechat_yaml/docs/configuration/librechat_yaml/object_structure, a nav-only folder with no index page, so the card promising the "complete field reference" 404'd. A repo-wide internal link sweep found this was the only broken/docstarget.(no single reporter; found while fixing the above): legacy
/toolkitURLsnext.config.mjsredirected/toolkit/yaml_checkerto/toolkit/yaml-checker, and neither route exists since the toolkit moved under/docs/toolkit. In-page links were unaffected becauselib/localize-href.tscanonicalizes them at render time, but direct hits and the one absolute toolkit URL in the Linux guide landed on a 404.localize-href.ts.1543536529195012169:/docs/configuration/stt_ttsspeechTabexample showed eleven keys and explained none.decibelValueis a silence threshold in dB (-100 to -30, default -45) andautoSendTextis a delay in seconds where-1disables auto-send. Also documentedallowedAddresses, which bothspeech.sttandspeech.ttsaccept and which every self-hosted example on the page needs.1506499310035140753:.../object_structure/custom_paramsdefaultParamsEndpoint?" The page only ever showed'google'.z.string().default('custom'), not an enum, and the panel resolves it viaparamSettings[key] ?? [], so an unrecognized value passes validation and renders an empty parameter panel. Listed the keys that resolve and documented that failure mode.1539423034283393146,1529194857564995645,1528452749685952575:.../ai_endpoints/ollamabaseURL, Ollama's default127.0.0.1bind, and the name-prefix rule behind model fetching (models.tsonly calls/api/tagswhen the endpoint name starts withollama, so renaming it silently empties the model list). The stop-sequence screenshot hadimageas its alt text and no caption.1494744632884596746:/docs/configuration/bannerupdate-bannerdoesfindOne()thenfindByIdAndUpdate, so there is only ever one banner and a second run overwrites the first. Two overlapping windows are therefore impossible; documented that and the early-takedown path.1528752311281647727:/docs/features/import_convos1508348821095059487,1508345688273191073:/docs/features/search,/docs/features1522687279234289807:.../object_structure/transactionsinterface.contextUsage/contextCost.1486774904136269884:/docs/configuration/authentication/SAML/auth0SAML_ISSUER, butsamlStrategy.js:315passes that as the strategy's ownissuer, i.e. the entity ID LibreChat asserts about itself and which must match the Audience set in Auth0. The IdP's issuer belongs inSAML_IDP_ISSUER(samlStrategy.js:185).1532228462868168886:/docs/features/agents,/docs/features/code_interpreterartifacts.mdx, but the same boilerplate survived as trailing hashtag lines on two other feature pages.1528641958187106465,1477743384113447032,1526344941800919159,1477745639617073208,1507234635573104813,1481873299515506808: custom endpointspackages/api/src/endpoints/custom/config.ts:21-28drops any endpoint missingname,baseURL,apiKeyormodels(or whosemodelshas neitherfetch: truenor a non-emptydefault) and logs nothing at all.groq.mdxthe enablement steps it never had.1496108363296018513:/docs/local/docs;/docs/local, the page this was filed against, rendered as a bare grid of install options with nothing saying LibreChat is not a downloadable app.1488860965666816060,1500577570784149656:/docs/configuration/pre_configured_ai/openaiuser_providedwas mentioned with no follow-up. Documented the Set API Key gear in the endpoint menu, the expiry choices, per-user encrypted server-side storage, and the revoke path.1517360828762947625:/docs/features/authenticationSESSION_EXPIRY(15m) andREFRESH_TOKEN_EXPIRY(7d) defaults, explained that the short token renews silently, and stated plainly that there is no anonymous mode.1482888861599399978:/docs/configuration/cdn/s3S3_REFRESH_EXPIRY_MSwas the one env var the storage code reads that the page never listed.1512086950859767868:/docs/configuration/cdn/azureValidation
pnpm lint:prettier: passedpnpm typecheck: passedpnpm lint: passedpnpm test: passed (391 tests, 33 files)pnpm build: passed (three times: initial, after rebasing onto main, and after the second batch)next start):/toolkit/yaml_checker,/toolkit/creds_generatorand/docs/configuration/librechat_yaml/object_structureall return 307 to targets that return 200. Every edited page verified 200./docstarget before this change, zero after. All 63 referenced images verified present.Playwright E2E was not run locally (no browser install in this environment). CI ran it on both batches and it passed each time, along with Format/types/lint and the Vercel preview build.
Not changed
Investigated and deliberately left alone:
main. The web search reports (1489404554603925676,1531586436560588862,1520465687997452485,1510282612353273856,1490947957611040850) are covered by 🔍 docs: Document SearXNG Search Options #732, which addedsearxngSearchOptions, the SSRF/allowedAddressessection and engine guidance, including thelocalhost:55011note. An earlier draft of this branch duplicated that work; it was dropped after rebasing. The leaked YouTube description on/docs/features/artifacts(1532228462868168886) was removed by 📝 docs: Prepare v0.8.8-rc1 release #699.librechat.yaml"where is the file / how do I mount it" cluster, the custom-endpoint and OpenRouter walkthroughs, the tools pages that referenced the removed Plugins menu, the desktop-installer question, and the outdateddocker-composebinary install in the Linux guide (nowdocker-compose-plugin).1536701666433310742(memory.agent.enabled) is PR docs(memory): document agent.enabled opt-in (ref #12886) #698.1515816392660746372(MongoDB Atlas walkthrough) is issue Feedback for “MongoDB Atlas” #165.1502727941241442344) is an external claim about DeepSeek's API that cannot be confirmed from this repository. The Gemini image-gen service-key report (1513519690930978856) describes an upstream runtime bug, not a docs error.skill_syncarray example, local MCP HTTP tutorial, RAG file types and attachment scope, banner screenshot.Review round
Rebased onto current
main(the v0.8.8-rc2 docs drop), then worked through four rounds of review until Codex returned no findings on the head commit. Detail in the first and second summary comments and in the individual threads. Sixteen findings addressed, one rejected with evidence.Three of them were reports that this PR contradicted an existing page. In two cases the existing page was the incorrect one, so it is corrected here:
speech.mdx:autoSendTextis seconds with-1disabling, not milliseconds with0disabling (useSpeechToTextBrowser.ts:78-82).speech.mdx:autoTranscribeAudiois continuous listening plus silence detection, not transcription of audio messages (useSpeechToTextBrowser.ts:126,useSpeechToTextExternal.ts:186).ollama.mdx: the stop-sequence examples still carried a stale "fetching list of models is not supported" comment, contradicting the page's own primary example.Review also caught three factual errors in my own first pass, all corrected: local file storage is not ephemeral under the standard compose deployment (
docker-compose.yml:35-36bind-mounts./imagesand./uploads); a renamed Ollama endpoint does not come back with an empty model list, because the generic/v1/modelspath is a fallback; and the Object Structure card fix only covered the unprefixed URL, leaving the card a 404 in all thirteen non-English locales. That last one is now fixed inlib/localize-href.ts, before locale prefixing, with a unit test.One finding was not accepted.
REFRESH_TOKEN_EXPIRYwas reported as a rolling window;setAuthTokensreusessession.expirationand onlycreateSessionappliesexpiresIn, so it is absolute from login. Documented the distinction rather than changing the claim, and separately scoped the whole section to LibreChat-issued tokens, sinceOPENID_REUSE_TOKENSdoes hand session lifetime to the provider.