Tags: raystack/chronicle
Tags
fix: await full SSR stream so first-byte HTML contains page content (#… …159) renderToReadableStream resolves when only the shell is ready, so the first flush contained just the Suspense skeleton fallback while real content streamed in later chunks. Await stream.allReady before responding so the complete document ships in a single response. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
fix: fallback to site description when page description missing (#149) Pages without frontmatter description now use config.site.description for meta description, og:description, and twitter:description tags. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat: add structured OTel request logs with source IP (#117) Adds OpenTelemetry SDK logs to the telemetry plugin, emitting structured log records to stdout for every HTTP request. Each log includes client.address (from x-forwarded-for/x-real-ip/remoteAddress), method, route, status code, and duration. Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fix: design QA sidebar spacing and alignment (#111) * fix: sidebar spacing and alignment - Sub-nav horizontal padding: 24px → 28px - Remove extra bottom padding on cardWrapper - Remove gap between top link items - Section spacing maintained at 24px Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: sidebar spacing adjustments - Remove margin-bottom from topLinks - Nav group header: zero top/bottom padding, 12px margin-bottom - Remove h3 margin inside sidebar nav groups Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: target h3 margin via navGroupHeader classNames prop Replace global selector hack with scoped .navGroupHeader h3. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: remove extra margins and padding from sidebar nav groups Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat: mobile responsive layout for default theme (#99) * feat: add mobile responsive layout for default theme Sidebar becomes slide-out drawer on <768px with backdrop overlay. Desktop sub-nav replaced with mobile header (hamburger + logo + search + theme switcher). Sidebar closes on navigation. Content padding and spacing reduced for mobile. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: match mobile layout to Figma design - Hamburger moved to right side with search + theme switcher - Menu is full-screen overlay below navbar (not side drawer) - Bottom prev/next navigation cards on mobile - Toggle between hamburger and X icon - Card 100% width on mobile - Content padding 40px top, 16px horizontal per Figma specs - Mobile nav gap 40px between prev/next cards Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address CodeRabbit review comments for mobile layout - Hide hamburger button when hideSidebar is true - Add type=button, aria-expanded, aria-controls for accessibility - Move mobileMenu data-open rule inside media query only - Add version switcher to mobile menu Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: remove min-width on API right block for mobile Reset min-width and max-width on stacked layout so code blocks don't overflow on mobile viewports. Add overflow-x: auto on code snippet body. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: reduce API layout gap on mobile Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: reduce API layout gap only on mobile (768px) Keep original gap at 1100px tablet breakpoint, reduce to space-5 only at 768px mobile breakpoint. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fix: normalize backslashes in image URLs for Windows paths (#101) * fix: normalize backslashes in image URLs Windows-style paths (adminimgs\project_1.png) caused 404s because backslashes aren't valid in URLs. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test: add backslash normalization tests for Windows path support Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: guard decodeURIComponent and use @ alias in test Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ci: add Docker build and run tests for Node and Bun (#100) * ci: add Docker build and run tests for Node and Bun Build and health-check chronicle with basic example on both runtimes. Verifies server starts, pages render, and search API responds. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: move Dockerfiles to docker/ directory Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: use node:24-slim and fix curl flags for redirect check Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: exclude test files from Nitro server bundle Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: split verify steps for better CI debug output Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: update CI checks to test index, page API, and search API Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ci: add image optimization API test Add test PNG to basic example and verify /api/image endpoint in CI. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ci: replace curl checks with node smoke test script 8 assertions: index, page API, search API, search query, image resize, image 400, image invalid width, image 404. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: rename docker/ to docker-tests/ Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ci: run Docker smoke tests only on pull requests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ci: move Docker smoke tests to separate pr.yaml workflow Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ci: rename pr.yaml to docker-smoke-test.yaml Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: use npm/bun init + local install instead of global Pack CLI as tarball, init project in runner, install locally. Tested on both Node and Bun — all 8 smoke tests pass. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: rename workflow name to docker-smoke-test Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: use /api/ready instead of /api/health for server readiness Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat: on-demand image optimization with sharp (#95) * feat: on-demand image optimization with sharp Add /api/image endpoint that resizes and converts content images to WebP on first request, caching results to disk. Images go from ~1.8MB originals to ~6KB optimized WebP at 640w. - New /api/image endpoint: accepts url, w (width), q (quality) params - Remark plugin rewrites image URLs to point through optimization endpoint - Image component and SSR preload use optimized URLs - SVGs pass through unchanged, sharp externalized for Nitro bundling - Allowlisted widths prevent cache flooding Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: remove unnecessary window.Image, use Image directly Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: rename Image component to MDXImage Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: use top-level import for sharp Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: content negotiation via Accept header for image format Serve AVIF, WebP, or original format based on browser Accept header. AVIF preferred > WebP > original (resized only). Adds Vary: Accept for proper CDN caching. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: use Nitro storage for image cache instead of manual fs Portable across deployment targets (filesystem, KV, Redis, etc.). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: extract image-cache storage key to constant Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: configure fs storage driver for image cache Persists optimized images to .cache/images/ on disk. Survives server restarts. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: use StatusCodes from http-status-codes, fix lint error Move useStorage before early returns to satisfy Biome hook ordering rule. Replace magic status numbers with StatusCodes constants. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * style: restore semicolons in new files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: extract DEFAULT_WIDTH and DEFAULT_QUALITY constants Replace magic numbers 1024 and 75 with named constants from image-utils.ts, used across all image optimization call sites. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test: add tests for image optimization utilities and API 24 tests covering negotiateFormat, cacheKey, MIME mapping, isLocalImage, isSvg, buildOptimizedUrl, and constants. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address image optimization review comments - Restrict quality to allowed steps [60, 75, 90, 100] with snap-to-nearest - Add cache stampede protection via in-flight promise map - Add LRU cache eviction with 500 entry cap - Skip image optimization rewrite for static build presets - Accept optimize option in remark-resolve-images plugin Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PreviousNext