fix: update QuickStart guide and SSL config for local Postgres dev#4
Conversation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…achability Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The default database URL used sslmode=require, but the docker-compose Postgres has no SSL configured — causing mantle init to fail for users following the QuickStart guide. Change the code default to sslmode=disable (matching the docs and the localhost dev URL) and add SSL guidance to the Getting Started guide. Production examples throughout the docs already use sslmode=require. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- google.golang.org/grpc v1.79.1 → v1.79.3 (fixes CVE-2026-33186) - Fix overlay cloneNode bug: closeSidebar referenced detached node (use onclick assignment instead of cloneNode pattern) - Safe-area-inset: bottom padding accounts for iOS home indicator - Tables: display:block + overflow-x:auto directly (no wrapper needed) - Remove overflow-x-hidden from docs container (was clipping tables) - Restore sslmode=disable as default for local dev (sslmode=require broke docker-compose dev workflow; warning still logs in production) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Aligns Mantle’s local-development Postgres defaults with the QuickStart experience by switching the default DB SSL mode to disable, and updates docs/site UI to reduce friction on mobile.
Changes:
- Updated default
database.urltosslmode=disableand adjusted config tests accordingly. - Updated Getting Started docs (repo docs + site docs) to explain SSL mode defaults and production recommendations.
- Improved mobile docs UX (bottom nav, padding, sidebar behavior) and prose responsiveness (tables/code sizing).
Reviewed changes
Copilot reviewed 11 out of 12 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
internal/config/config.go |
Changes default Postgres URL to sslmode=disable. |
internal/config/config_test.go |
Updates assertions to match the new default DB URL. |
docs/getting-started.md |
Adds guidance about SSL mode defaults and production SSL settings. |
site/src/content/docs/getting-started/index.md |
Adds the same SSL guidance to the site’s Getting Started page. |
site/src/components/Nav.astro |
Replaces the hamburger menu with a fixed mobile bottom navigation and docs menu trigger. |
site/src/components/DocsSidebar.astro |
Adjusts mobile sidebar sizing/spacing and simplifies close handlers. |
site/src/layouts/Docs.astro |
Adds bottom padding to avoid mobile bottom-nav overlap. |
site/src/pages/index.astro |
Adds bottom padding to avoid mobile bottom-nav overlap. |
site/src/styles/global.css |
Makes prose tables scrollable and tweaks mobile typography/code rendering. |
go.mod |
Bumps indirect google.golang.org/grpc version. |
go.sum |
Updates checksums for the gRPC version bump. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
1. sslmode=disable → sslmode=prefer (tries TLS, graceful fallback for local dev) 2. grpc bump is intentional (CVE-2026-33186) — already noted in PR description 3. Table scroll comment updated to match unconditional behavior 4. isDocs derived from pathname (/docs prefix) not !isHome — fixes 404 page 5. 404 page gets pb-20 for mobile bottom nav clearance 6. Broken /configuration link → /docs/configuration in getting-started Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 12 out of 13 changed files in this pull request and generated 2 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
1. Table CSS: removed display:block (breaks border-collapse), use :has(> table) for scrollable parent instead, preserving table layout 2. getting-started.md: sslmode=disable → sslmode=prefer to match code default Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 12 out of 13 changed files in this pull request and generated 2 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…fset 1. Bottom nav: md:hidden → lg:hidden so menu button is visible at 768-1023px (bridging the gap between mobile and desktop sidebar) 2. Bottom padding: md:pb-0 → lg:pb-0 on all pages to match 3. Sidebar mobile bottom: responsive class instead of inline style, only reserves bottom-nav space below lg breakpoint Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Deploying mantle with
|
| Latest commit: |
fa47ef6
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://0d028c1e.mantle-cxy.pages.dev |
| Branch Preview URL: | https://fix-quickstart-ssl-config.mantle-cxy.pages.dev |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 12 out of 13 changed files in this pull request and generated 2 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
1. Table scroll: .prose :has(> table) → .prose:has(table) so it matches when table is a direct child of the prose article 2. Sidebar toggle: aria-expanded on button, aria-hidden toggled on overlay in sync with visibility state Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 12 out of 13 changed files in this pull request and generated 3 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| function closeSidebar() { | ||
| mobileSidebar.classList.add('-translate-x-full'); | ||
| overlay.classList.add('hidden'); | ||
| } | ||
|
|
||
| const newBtn = toggleBtn.cloneNode(true); | ||
| toggleBtn.parentNode?.replaceChild(newBtn, toggleBtn); | ||
| newBtn.addEventListener('click', () => { | ||
| const isOpen = !mobileSidebar.classList.contains('-translate-x-full'); | ||
| if (isOpen) closeSidebar(); else openSidebar(); | ||
| }); | ||
|
|
||
| const newOverlay = overlay.cloneNode(true); | ||
| overlay.parentNode?.replaceChild(newOverlay, overlay); | ||
| newOverlay.addEventListener('click', closeSidebar); | ||
|
|
||
| overlay.onclick = closeSidebar; | ||
| mobileSidebar.querySelectorAll('a').forEach((a) => { | ||
| a.addEventListener('click', closeSidebar); | ||
| a.onclick = closeSidebar; | ||
| }); |
There was a problem hiding this comment.
closeSidebar() hides the overlay and drawer but does not restore aria-hidden on the overlay or reset aria-expanded on the docs menu button. If the user closes via overlay click or by selecting a link, assistive tech state can remain stuck as “expanded/visible”. Update closeSidebar() to set overlay.setAttribute('aria-hidden','true') and reset the button’s aria-expanded as well.
1. Distinct aria-labels: "Main navigation" and "Mobile navigation" 2. closeSidebar() now resets aria-hidden on overlay and aria-expanded on the menu button (fixes stuck state on overlay/link close) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 12 out of 13 changed files in this pull request and generated no new comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Caution Review failedThe pull request is closed. Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughNarrowed CI push trigger to Changes
Sequence Diagram(s)sequenceDiagram
participant User as "User (Mobile)"
participant BottomNav as "Mobile Bottom Nav\n(site/src/components/Nav.astro)"
participant DocsSidebar as "Docs Sidebar\n(site/src/components/DocsSidebar.astro)"
participant Overlay as "Backdrop Overlay\n(`#sidebar-overlay`)"
rect rgba(240,248,255,0.5)
User->>BottomNav: tap Docs Menu button
BottomNav->>DocsSidebar: toggle open (remove -translate-x-full)
BottomNav->>Overlay: show (hidden=false, aria-hidden=false)
DocsSidebar->>Overlay: set link onclick to close
end
rect rgba(245,255,240,0.5)
User->>Overlay: tap overlay or nav link
Overlay->>DocsSidebar: close (add -translate-x-full, inert=true, aria-hidden=true)
Overlay->>BottomNav: update button aria-expanded=false
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@site/src/components/DocsSidebar.astro`:
- Around line 162-180: The external GitHub anchor (the <a> element with
href="https://github.com/dvflw/mantle" and link text "GitHub") should open in a
new tab and avoid exposing the opener; update that anchor to include
target="_blank" and rel="noopener" (or rel="noopener noreferrer") to implement
the change.
In `@site/src/components/Nav.astro`:
- Around line 77-99: The sidebar toggle logic in initNav duplicates the code in
DocsSidebar; extract a shared function (e.g., toggleDocsSidebar(open: boolean))
that encapsulates the DOM manipulations now in initNav (toggling
'-translate-x-full' on docsSidebar, adding/removing 'hidden' on overlay, and
setting overlay aria-hidden and btn aria-expanded) and export or import it so
both Nav.astro's initNav and DocsSidebar call the same function (use a single
source of truth for open/close), keep the early guards for missing elements in
the shared helper or have callers validate, and ensure both components still
re-initialize on astro:after-swap to preserve view transition behavior.
- Around line 37-59: The external GitHub anchor
(href="https://github.com/dvflw/mantle", the element using class
"bottom-nav-item") must open in a new tab and avoid opener leaks; update that
<a> to include target="_blank" and rel="noopener" (or rel="noopener noreferrer")
so the external link behavior matches DocsSidebar and is secure.
In `@site/src/styles/global.css`:
- Around line 405-407: The CSS rule for the ".prose code" selector uses the
deprecated property value "word-break: break-word"; update that rule by removing
"word-break: break-word" and replace it with the modern equivalent, e.g. set
"overflow-wrap: anywhere" (optionally paired with "word-break: normal") inside
the ".prose code" block to preserve wrapping behavior without triggering
stylelint warnings.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 3e4238c0-18dc-4fc9-940d-9ef46fa17063
⛔ Files ignored due to path filters (1)
go.sumis excluded by!**/*.sum
📒 Files selected for processing (12)
.github/workflows/ci.ymldocs/getting-started.mdgo.modinternal/config/config.gointernal/config/config_test.gosite/src/components/DocsSidebar.astrosite/src/components/Nav.astrosite/src/content/docs/getting-started/index.mdsite/src/layouts/Docs.astrosite/src/pages/404.astrosite/src/pages/index.astrosite/src/styles/global.css
| <script is:inline> | ||
| function initNav() { | ||
| const btn = document.getElementById('mobile-menu-btn'); | ||
| const menu = document.getElementById('mobile-menu'); | ||
| if (!btn || !menu) return; | ||
| // Remove old listeners by cloning | ||
| const newBtn = btn.cloneNode(true); | ||
| btn.parentNode?.replaceChild(newBtn, btn); | ||
| newBtn.addEventListener('click', () => menu.classList.toggle('hidden')); | ||
| const btn = document.getElementById('bottom-nav-docs-btn'); | ||
| const docsSidebar = document.getElementById('docs-sidebar-mobile'); | ||
| const overlay = document.getElementById('sidebar-overlay'); | ||
| if (!btn || !docsSidebar || !overlay) return; | ||
|
|
||
| btn.setAttribute('aria-expanded', 'false'); | ||
|
|
||
| btn.onclick = () => { | ||
| const isOpen = !docsSidebar.classList.contains('-translate-x-full'); | ||
| if (isOpen) { | ||
| docsSidebar.classList.add('-translate-x-full'); | ||
| overlay.classList.add('hidden'); | ||
| overlay.setAttribute('aria-hidden', 'true'); | ||
| btn.setAttribute('aria-expanded', 'false'); | ||
| } else { | ||
| docsSidebar.classList.remove('-translate-x-full'); | ||
| overlay.classList.remove('hidden'); | ||
| overlay.setAttribute('aria-hidden', 'false'); | ||
| btn.setAttribute('aria-expanded', 'true'); | ||
| } | ||
| }; |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Consider extracting shared sidebar toggle logic to avoid duplication.
Both Nav.astro (lines 86-98) and DocsSidebar.astro (lines 190-196) manage the same sidebar/overlay state with similar code. The open logic here and close logic in DocsSidebar could drift out of sync.
Consider extracting a shared utility (e.g., toggleDocsSidebar(open: boolean)) that both components invoke, or consolidating all toggle/close logic in one place.
Otherwise, the implementation is correct:
- Early return guards against missing elements on non-docs pages
- ARIA state is properly synchronized with visual state
- Re-initialization on
astro:after-swaphandles View Transitions correctly
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@site/src/components/Nav.astro` around lines 77 - 99, The sidebar toggle logic
in initNav duplicates the code in DocsSidebar; extract a shared function (e.g.,
toggleDocsSidebar(open: boolean)) that encapsulates the DOM manipulations now in
initNav (toggling '-translate-x-full' on docsSidebar, adding/removing 'hidden'
on overlay, and setting overlay aria-hidden and btn aria-expanded) and export or
import it so both Nav.astro's initNav and DocsSidebar call the same function
(use a single source of truth for open/close), keep the early guards for missing
elements in the shared helper or have callers validate, and ensure both
components still re-initialize on astro:after-swap to preserve view transition
behavior.
- Remove 12 docs/*.md files (content lives in site/src/content/docs/) - Update all mantle.dev references → mantle.dvflw.co across: internal/cli/root.go, site/src/layouts/Base.astro, astro.config.mjs, site/src/pages/404.astro, marketing/*.md Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
…ted CSS - README doc links now point to https://mantle.dvflw.co/docs/* - GitHub external links get target="_blank" rel="noopener" - word-break: break-word → overflow-wrap: anywhere (deprecated property) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@README.md`:
- Line 53: The README contains two broken documentation links
(https://mantle.dvflw.co/docs/plugins and
https://mantle.dvflw.co/docs/contributing) that return 404; update or remove
them by either deploying the missing docs or replacing the links in README.md
with correct, working URLs (or remove the link text) so the README no longer
references the two failing URLs; ensure both instances (the plugins link and the
contributing link) are fixed.
In `@site/src/components/DocsSidebar.astro`:
- Line 96: The mobile docs sidebar (`#docs-sidebar-mobile`) is only visually
hidden via CSS transform so its links remain in the accessibility tree; update
the toggle logic that controls the sidebar (the element referenced by id
"docs-sidebar-mobile" and the corresponding Nav.astro drawer toggle) to set
aria-hidden="true" when closed and remove it when opened, and also apply an
inert equivalent (e.g., inert property or a data-inert attribute with matching
CSS/JS to prevent focus) so links are removed from the tab order; ensure the
same change is applied to the other drawer control in Nav.astro (and the related
lines around 190-195) so both visual and assistive-state are synchronized when
opening/closing.
In `@site/src/components/Nav.astro`:
- Line 7: The docs-route test using Astro.url.pathname.startsWith('/docs') is
too loose and matches paths like /docs-preview; update the isDocs check (where
isDocs is defined) to only be true when the path is exactly '/docs' or begins
with '/docs/' (i.e., replace the current startsWith check with a combined
condition that checks Astro.url.pathname === '/docs' ||
Astro.url.pathname.startsWith('/docs/')) so the Docs highlight and Menu
rendering only apply within the docs tree.
- Around line 79-82: The inline script in Nav.astro exits early because
document.getElementById calls for btn, docsSidebar, and overlay run before the
sidebar/overlay are parsed; update the initialization so it waits for the DOM or
for the sidebar elements: wrap the existing initialization logic that references
btn, docsSidebar, and overlay into a DOMContentLoaded handler or implement a
MutationObserver that watches for the presence of the docsSidebar and overlay
elements and only then attaches event listeners to btn; keep the same element
IDs (bottom-nav-docs-btn, docs-sidebar-mobile, sidebar-overlay) and move all
code that currently returns when elements are missing into the deferred callback
so the button works on first load.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: db7f5231-9646-4a47-9918-1064a267d78c
📒 Files selected for processing (3)
README.mdsite/src/components/DocsSidebar.astrosite/src/components/Nav.astro
Verified each finding — all 4 needed fixes:
1. README: /docs/plugins → /docs/plugins-guide, /docs/contributing → CONTRIBUTING.md
2. Sidebar: aria-hidden="true" + inert on mobile drawer when closed,
synced on open/close in both Nav and DocsSidebar handlers
3. isDocs: strict check — pathname === '/docs' || startsWith('/docs/')
4. Nav script timing: deferred init via requestAnimationFrame loop
until sidebar DOM exists (Nav renders before DocsSidebar)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@site/src/components/Nav.astro`:
- Around line 104-115: The deferInitNav loop can spin forever on non-docs pages;
modify deferInitNav (and its astro:after-swap handler) to stop rescheduling when
the docs sidebar is never present — add a small retry/backoff and bail-out:
introduce a counter (e.g. retryCount with MAX_RETRIES) and a stored
requestAnimationFrame id, call initNav() when
document.getElementById('docs-sidebar-mobile') exists, otherwise increment
retryCount and only call requestAnimationFrame(deferInitNav) while retryCount <
MAX_RETRIES; also update the astro:after-swap listener to check for the sidebar
presence before scheduling or reset retryCount when the current route/page
clearly contains docs so the loop isn’t restarted on non-doc pages (referencing
deferInitNav, initNav, 'docs-sidebar-mobile', and the 'astro:after-swap'
listener).
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 7976e31c-f06f-4a57-a31e-d7af59ac8f27
📒 Files selected for processing (3)
README.mdsite/src/components/DocsSidebar.astrosite/src/components/Nav.astro
- Warn at startup when database URL uses sslmode=prefer with a non-loopback host (localhost/127.0.0.1/::1 are excluded) - Prefix inline script globals in Nav.astro (_mantleNavRetries, _mantleDeferInitNav) to avoid collisions Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
site/src/components/Nav.astro (1)
2-7:⚠️ Potential issue | 🟡 MinorHide the mobile docs menu when the sidebar isn't mounted.
isDocsis path-based, so/docs/...404s render theMenubutton too.site/src/pages/404.astrocurrently uses<Base><Nav /></Base>withoutDocsSidebar, so the retry loop bails out and mobile docs 404s are left with a dead control; gate this button on whether the current layout actually renders the sidebar, or move docs-scoped 404s onto the docs layout. (github.com)♻️ Possible direction
interface Props { isHome?: boolean; + hasDocsSidebar?: boolean; } -const { isHome = false } = Astro.props; +const { isHome = false, hasDocsSidebar = false } = Astro.props; const prefix = isHome ? '' : '/'; const isDocs = Astro.url.pathname === '/docs' || Astro.url.pathname.startsWith('/docs/'); @@ - {isDocs && ( + {isDocs && hasDocsSidebar && ( <button id="bottom-nav-docs-btn" class="bottom-nav-item flex flex-col items-center gap-0.5 px-3 py-1 text-[11px] text-on-surface-variant hover:text-on-surface transition-colors" aria-label="Documentation menu">Then have
site/src/layouts/Docs.astroopt in withhasDocsSidebar={true}.Also applies to: 44-49, 103-120
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@site/src/components/Nav.astro` around lines 2 - 7, The Nav component currently computes isDocs from the URL and always shows the mobile Docs Menu button even when the DocsSidebar isn't mounted; update Nav to accept a prop (e.g., hasDocsSidebar) and change the logic that renders the Menu button and any docs-scoped controls (currently guarded by isDocs) to require hasDocsSidebar && isDocs so the button is hidden when the sidebar isn't present; then have the Docs layout (Docs.astro) pass hasDocsSidebar={true} into Nav and leave other consumers (like the 404 page using Base<Nav />) unchanged so they no longer render the dead Menu control.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@internal/config/config.go`:
- Around line 236-247: Replace the fragile literal host checks after
url.Parse(dbURL) with proper loopback detection: skip empty host; treat
"localhost" case-insensitively via strings.EqualFold(host, "localhost");
otherwise try net.ParseIP(host) and consider it loopback if ip != nil &&
ip.IsLoopback(); only emit the sslmode=prefer warning when the host is neither
"localhost" (case-insensitive) nor an IP that IsLoopback(); update imports to
include "net" and "strings" as needed and keep the existing q.Get("sslmode") and
log.Printf usage.
---
Outside diff comments:
In `@site/src/components/Nav.astro`:
- Around line 2-7: The Nav component currently computes isDocs from the URL and
always shows the mobile Docs Menu button even when the DocsSidebar isn't
mounted; update Nav to accept a prop (e.g., hasDocsSidebar) and change the logic
that renders the Menu button and any docs-scoped controls (currently guarded by
isDocs) to require hasDocsSidebar && isDocs so the button is hidden when the
sidebar isn't present; then have the Docs layout (Docs.astro) pass
hasDocsSidebar={true} into Nav and leave other consumers (like the 404 page
using Base<Nav />) unchanged so they no longer render the dead Menu control.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 10d8c881-1ca7-4098-a3af-b8a772d670d8
📒 Files selected for processing (2)
internal/config/config.gosite/src/components/Nav.astro
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
The CodeRabbit suggestion (4b48827) replaced the simple string comparison with net.ParseIP/strings.EqualFold but didn't add the required imports, breaking CI. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
@coderabbitai this is ready for review |
|
✅ Actions performedReview triggered.
|
Summary
Changes
Security
Configuration
sslmode=prefer(tries TLS, falls back gracefully for local dev without triggering warnings)Copilot Review Fixes
sslmode=preferinstead ofdisable(better security posture)isDocsderived from URL pathname, not!isHome(fixes 404 page showing docs menu)/configurationlink →/docs/configurationin getting-startedSite Fixes
closeSidebar()referenced detached DOM nodedisplay:block+overflow-x:autodirectly (removed unused.table-wrapper)overflow-x-hiddenfrom docs container (was clipping wide tables)Test plan
go build ./...passesgo test ./internal/config/passesnpx astro build— 30 pagessslmode=preferSummary by CodeRabbit
New Features
Documentation
Bug Fixes
Chores