Tags: QuackbackIO/quackback
Tags
fix: cursor pagination and date filtering for search (#61) Fix cursor-based pagination failing on page 2+ by converting TypeID to UUID and Date to ISO string before interpolating into SQL tuple comparisons. Add dateFrom/dateTo params to MCP search tool and public API for date-range filtering. Add composite (role, created_at) index on principal table.
feat: SEO meta tags, sitemap, ESLint conventions, and OpenAPI workflow ( #60) * feat: add SEO meta tags, sitemap/robots.txt, and enforce import conventions - Add OG/Twitter meta tags and canonical URLs to all portal routes - Generate dynamic sitemap.xml with public posts and changelog entries - Add robots.txt blocking admin/auth/api paths - Add ESLint rules enforcing @/lib/server/db and @/lib/shared/db-types imports over direct @quackback/db usage - Add max-lines and lib-cannot-import-components lint rules - Migrate all existing imports to canonical paths - Slim down CLAUDE.md to concise essentials * chore: bump version to 0.3.6 * feat: add OpenAPI spec generation script and release workflow * fix: filter private boards from sitemap and remove arbitrary post limit * refactor: follow sitemap best practices - lastmod, index pagination, drop priority/changefreq - Replace priority/changefreq with lastmod (W3C date) - crawlers ignore the former - Auto-generate sitemap index when URLs exceed 50,000 protocol limit - Extract pure sitemap builders into testable module with 18 unit tests - Filter private/deleted boards from sitemap (addresses Codex P1) - Remove arbitrary 5,000 post cap (addresses Codex P2)
fix: use config.baseUrl instead of request.url to prevent mixed conte… …nt errors (#55) Behind Cloudflare TLS termination, request.url arrives as http:// causing the widget iframe, RSS feed, and API docs to generate http:// URLs on HTTPS sites. Co-authored-by: Claude Opus 4.6 <[email protected]>
fix: responded/unresponded filter crashes with wrong column reference (… …#54) * fix: responded/unresponded filter query references wrong table columns Drizzle's relational query builder (db.query.posts.findMany) rewrites all column references to use the outer table's alias. Using ${comments.postId} inside a sql`` subquery caused it to generate "posts"."post_id" instead of "comments"."post_id", crashing with 'column posts.post_id does not exist'. Use raw SQL column names for the comments table in the EXISTS subquery to prevent Drizzle from rewriting them. Closes #46 * fix: responded/unresponded filter crashes with wrong column reference Drizzle's relational query builder rewrites column references in sql`` template literals to use the outer table's alias. This caused ${comments.postId} to generate "posts"."post_id" instead of "comments"."post_id", crashing with 'column posts.post_id does not exist' when using the Responded/Unresponded filter. Use raw SQL column names for comments table in EXISTS subqueries to prevent Drizzle from rewriting them. Also rename "Response" filter label to "Team response" for clarity. Closes #46
fix: use server-resolved BASE_URL via router context for settings pag… …es (#44) The previous fix (#43) switched to window.location.origin on the client, which breaks reverse proxy deployments where BASE_URL differs from the browser origin. Thread BASE_URL through the bootstrap server function into the router context so it always reflects the configured value.
fix: use shared getBaseUrl for MCP and widget settings URLs (#43) The loader-based server config import for baseUrl didn't work during client-side navigation (server config unavailable on client). Switch to the shared getBaseUrl() from lib/shared/routing which uses window.location.origin on the client and process.env.BASE_URL on the server.
PreviousNext