Multi-repo changelog support: link multiple GitHub repos to a project
Link multiple GitHub repositories to a single project — Projects can now track one or more GitHub repositories via a new project_repos table. You can add and remove repo links in project settings, webhooks and sync pipelines now run per linked repo (so one repository can trigger multiple projects), and history is preserved when removing links.
API
Added GET /v1/projects/:projectId/repos to list linked repositories and POST /v1/projects/:projectId/repos to link a repository; the POST validated installation ownership, created a project_repos row, fired repo/sync.requested with projectRepoId, and wrote a repo.connected audit entry.backend
Added DELETE /v1/projects/:projectId/repos/:repoId to remove a repository link, enforced a minimum of one linked repo (returned 422 if removal would leave zero), preserved commit and changelog history, and wrote a repo.disconnected audit entry.backend
Changed POST /v1/projects to create a seed project_repos row during project creation and include projectRepoId in the repo/sync.requested event.backend
Changed POST /v1/projects/:projectId/resync and the GitHub webhook handler to fan out one sync or push event per linked repo, with each event carrying projectRepoId and trackedBranch so multiple projects can receive events from the same repository.backend
Removed repo_owner and repo_name from the project object in GET /v1/changelog/:slug responses since repo coordinates moved to project_repos.backend
Improvements
Added a new project_repos join table via migration that backfilled existing projects, stored repo coordinates and sync metadata, enforced uniqueness, and applied row-level security consistent with projects.database
Added ProjectRepoRepository (exposed as db.projectRepos) with create, findByProjectId, findByRepo, findByInstallation, findById, updateSyncStatus, updateAvailableBranches, and delete methods.database
Moved repo-specific data and methods off the projects row — ProjectRepository was simplified and database types were updated so repo fields are now stored only on project_repos.database
Updated Inngest pipelines and event shapes to include projectRepoId on github/push.received, repo/sync.requested and commit/received; repo/sync.requested now accepted a 'repo_added' trigger and wrote sync status to project_repos.backend
Changed sync and push processing (github-sync-all-commits, github-process-push, and sync-repo) to fan out per project_repos row and to use trackedBranch and projectRepoId from the project_repos row.backend
Improvements
Added ProjectReposSection to project settings with an Add Repository modal (installation → repo → branch), per-row Remove button with confirmation, and display of sync status, tracked branch, and last-synced time.frontend
Added web proxy routes and client hooks (useProjectRepos, useAddProjectRepo, useRemoveProjectRepo), updated Dashboard, ProjectGrid, ProjectCard, project header, ProjectSwitcher, and ProjectSettings to fetch and render primary repo data correctly.frontend
Bug Fixes
Fixed a bug where the project_repos create result was not assigned (projectRepo was undefined), preventing the Inngest event from including projectRepoId.backend
Added and updated unit and end-to-end tests across database, API, and Inngest to cover the new multi-repo behavior, repository methods, and webhook fan-out.
Projects can now track commits from multiple GitHub repositories — A new project_repos join table was added so one changelog can include commits from many repositories. The migration back-filled existing repo links and removed single-repo columns from projects. The web UI and API now let you link and manage multiple repos per project.
New Features
Added a project_repos join table so a single project changelog can aggregate commits from multiple repositories.database
Added API endpoints to manage repo links: POST/GET /v1/projects/:id/repos and DELETE /v1/projects/:id/repos/:repoId.backend
Added a Repositories section in Project Settings (ProjectReposSection) to add, list, and remove linked repositories from the web UI.frontend
Created a project_repos row automatically when a project is created and queued a sync for that repo.backend
Webhooks were updated to fan out one github/push.received event per linked repo so the same repository can feed multiple projects.integrations
Improvements
Moved per-repo sync state and branch metadata off projects and onto project_repos (sync_status, tracked_branch, available_branches, last_synced_at, last_sync_error).database
Updated background sync and webhook flows to use projectRepoId and per-repo branch filtering, improving correctness for multi-repo projects.backend
Refactored database layer: added ProjectRepoRepository and removed single-repo methods from ProjectRepository.database
Updated web components (ProjectCard, ProjectGrid, ProjectSwitcher, project settings and proxy routes) to display and manage repo links and a project's primary repo.frontend
Expanded tests to cover project-repos behaviour and updated webhook and project-create tests for the new fan-out and projectRepoId contract.backend
API
repo/sync.requested, github/push.received, and commit/received events now include projectRepoId (and github/push.received also includes trackedBranch).backend
repo/sync.requested added a new trigger value triggeredBy = repo_added when a repo is linked.backend
POST /v1/projects now creates the project row and a corresponding project_repos row; the initial sync event includes projectRepoId.backend
POST /v1/projects/:id/resync now queues a repo/sync.requested event for each linked repository instead of a single project-level sync.backend
Breaking Changes
The projects table no longer contains github_installation_id, repo_owner, repo_name, tracked_branch, available_branches, sync_status, last_synced_at, or last_sync_error; those columns were moved to project_repos.database
A database migration (supabase/schema/011_project_repos.sql) was included that back-filled existing repo data into project_repos before dropping the old project columns; you must run this migration when upgrading.devops
Integrations and background functions that relied on project-level repo fields or project-level sync_status must be updated to use projectRepoId and project_repos.integrations
Database
Added migration and schema for project_repos, indexes, constraints, RLS policies, and triggers; back-filled existing project repo data.database
Dropped single-repo constraints and indexes on projects and added a uniqueness constraint per (project_id, installation, owner, name) in project_repos.database
Single GitHub tab for repos; entries dated and ordered by actual commits
Repository management moved into the GitHub tab — Project repository settings are no longer duplicated across tabs. Repositories are now managed from the single GitHub tab in Project Settings, and the settings form accepts the current repos so configuration is easier to find and update.
Changelog entries reflect real commit times and sources — Entries are now enriched with commit metadata (commit time, short SHA, and repo when available) and the list is sorted by actual commit timestamp (falling back to creation time). Entry cards show the commit date, short SHA and repo owner/name so the feed matches real commit order across linked repositories.
New Features
Moved repository management into the GitHub tab of Project Settings so the Repositories section no longer appears duplicated across tabs.frontend
Improvements
Updated the project header to show either repo_owner/repo_name for single‑repo projects or “N repositories” for multi‑repo projects, and to derive an overall sync status across all linked repos.frontend
Increased the default entries list limit and allowed fetching up to 100 entries to improve list loading for larger projects.backend
API
Joined entries with commits to return committed_at and SHA, enriched each entry with committed_at, commit_sha_short, repo_owner and repo_name (when known), and sorted entries by committed_at DESC with fallback to created_at.backend
Extended EntryListItem with commit_shas, committed_at, commit_sha_short, repo_owner and repo_name fields so clients can display accurate commit metadata.database
Bug Fixes
Fixed entry ordering so the changelog list reflects actual commit order across all linked repositories.backend
Changelog: newest-first sorting and structured, collapsible sections
Entries now show newest first — Changelog entries are ordered by publication date (newest first) so you see the latest updates up front.
Structured sections are shown as collapsible accordions — Entry content now uses collapsible section accordions for clearer organization and easier scanning of long entries.
Improvements
Sorted changelog entries by publication date in descending order (newest first).backend
User interface
Refactored entry layout to present date, metadata, and title in a clearer two-column layout with section accordions.frontend
Customization
Added an option to hide the date in entry metadata for more flexible presentation.frontend
Rendering
Updated the markdown renderer to optionally skip structured sections when entries prefer manual content.frontend
Maintenance
Removed unnecessary client-side expanded-state and routing logic from the feed for simpler behavior.frontend
Normalize Clerk organization admin roles to internal admin
Clerk namespaced admin roles now grant admin access — Roles returned by Clerk that include namespaces (for example `org:admin` or `org:owner`) are now normalized to the app's internal `admin` role so organization members receive the correct access and permissions.
New Features
Added a role-mapping function that normalizes Clerk membership roles (e.g., `org:admin`, `owner`) to the app's `admin` and `member` roles.auth
Improvements
Updated webhook handlers so membership creation and updates use the new role mapping, ensuring members are assigned the correct admin/member role.backend
Added a fallback in the project creation flow: if creating a project for an organization is forbidden, the request now falls back to creating a personal project for the user instead of failing silently.frontend
Added an automated test to verify correct role mapping during membership.created events.backend
Documentation
Updated backlog with prioritized proposals for explicit project owner selection and multi-organization membership behavior.
Guard DB access in web server components and exclude DB packages from bundling
Bug Fixes
Guarded getDb() calls across web server components so the app now handles database unavailability without crashing (renders empty project lists or shows not-found where appropriate).frontend
Improvements
Updated Next.js config to keep @suprlogs/database and @supabase/supabase-js as Node externals, preventing webpack from bundling Node-only modules (ws, node-fetch) for server components.devops
Legal pages, SEO routes, brand refresh, and custom 404s
Full legal pages with shared LegalLayout — Added complete Terms of Service, Privacy Policy, and Cookie Policy pages (replacing placeholders). All three pages use a shared LegalLayout, include canonical/OG/Twitter metadata, and publish contact details for legal/support (legal@suprlogs.com / support@suprlogs.com).
New BrandLogo component and refreshed wordmark — Introduced a single BrandLogo component that renders the acid‑green "S" block and the wordmark with a pink→purple gradient on “Logs”. The new component replaced duplicated logo markup in the header, footer, and sidebar for a consistent brand across the site.
SEO routes (global + per‑project) and llms.txt — Added global robots, sitemap and llms.txt routes plus visibility‑aware project‑scoped robots.txt, sitemap.xml, and llms.txt under changelog/[slug]. Project routes respect public/private/unlisted visibility and are served via the subdomain rewrite so hosted changelogs expose correct SEO files.
Custom 404s and marketing homepage refresh — Added branded global and changelog‑scoped 404 pages. Updated the marketing homepage with a marquee strip, two‑column hero (gradient headline), mock project feed, a stats strip, three‑step pipeline, and social‑proof audience cards.
New Features
Added full Terms, Privacy, and Cookie Policy pages with verbose legal text and shared LegalLayout.frontend
Added BrandLogo component to centralize site logo and gradient wordmark.frontend
Added global robots, sitemap, and llms.txt routes to the marketing site.backend
Added per‑project (changelog/[slug]) robots.txt, sitemap.xml, and llms.txt that return non‑indexable responses for private/unlisted projects.backend
Added project‑scoped 404 page for changelog subdomains and a branded global 404 page.frontend
Improvements
Refreshed marketing homepage with marquee, two‑column hero, mock feed, stats strip, pipeline steps, and social‑proof cards.frontend
Replaced duplicated inline logo markup in header, footer, and sidebar with the new BrandLogo component for consistent styling.frontend
Added Cookies link to the footer next to Terms and Privacy.frontend
Added noindex / nofollow robots metadata to /app, /sign-in, and /sign-up layouts to exclude auth and dashboard routes from search indexing.auth
Removed a duplicate manual <link rel="canonical"> from the changelog entry page in favor of metadata-driven canonical links.frontend
Added /cookie-policy and /llms.txt to the public route matcher so these pages bypass auth checks.auth
Documentation & Legal
Published complete legal copy adapted from SuprKeywords and added canonical/Og/Twitter metadata for Terms, Privacy, and Cookie Policy.frontend
Adjusted sign-in/sign-up button color and improved dark‑mode input placeholders
Bug Fixes
Updated the Sign in and Sign up primary button to use an accessible acid-green background (#ccff00) with black text and improved hover behavior so the Continue button is clearer.frontend
Fixed input fields in dark mode so placeholders, text, and borders are readable against the background.frontend
Fix Project creation wizard layout for consistent full-height display
Bug Fixes
Updated the ProjectCreationWizard to use a full-height container (min-h-full) instead of forcing screen height (min-h-screen), improving layout consistency across different screen sizes.frontend
Redesigned sign-in and sign-up with split-screen layout and AuthPageNav
Split-screen auth pages with a benefits panel — Sign-in and sign-up pages were redesigned to a split-screen layout: the authentication form sits on one side and a short, actionable benefits panel sits on the other. The benefits panel highlights key product value (examples below) so new and returning users understand what they get before signing in.
- Connect any GitHub repository
- Instant changelog generation from commits
- Draft → approve → publish workflow
- Hosted, shareable changelog at your-project.suprlogs.app
New Features
Added a split-screen sign-in and sign-up layout that shows the auth form alongside a short benefits panel to explain value and next steps.frontend
Added a reusable AuthPageNav at the top of auth pages with the brand logo, theme toggle, and a clear link to the opposite action (Sign in / Sign up).auth
Improvements
Updated the look and feel of the Clerk sign-in/sign-up forms (buttons, labels, and colors) for clearer calls to action and a more consistent visual style.frontend
Updated on-page copy to make it easier to understand next steps (connect a repo, generate changelogs, publish) and to surface the "Sign up free" / "Sign in" links more prominently.frontend
Replaced pino with a StructuredLogger interface and console fallback
Switched to a structured logger with a safe fallback — Logging was refactored to use a new StructuredLogger interface. Where the pino library is unavailable, a console-based fallback logger is used so logging continues to work in all environments.
Improvements
Introduced a new StructuredLogger interface and updated logger creation to use it.backend
Implemented a console-based fallback logger for environments where pino is not installed.backend
Removed pino from the web app dependencies to make the shared logger implementation optional.frontend
Breaking Changes
Removed the pino dependency and replaced the concrete pino implementation with a StructuredLogger interface. Code that relied on pino-specific APIs or internals may need to be updated or re-add pino as a dependency.
Public changelog pages: subdomains, Linear theme, and password gate
Public-facing changelog pages with subdomain URLs and a Linear-style theme — The app now serves public changelogs at [slug].suprlogs.app (or /changelog/[slug] in dev). Public list and entry pages are server-rendered with SEO/Open Graph metadata, a Linear-inspired design, tag filtering, inline expansion, and an optional password visibility gate.
New Features
Added transparent subdomain routing so requests to [slug].suprlogs.app are rewritten to /changelog/[slug]/*, allowing one deployment to serve both the admin site and public changelogs.devops
Added a server-rendered changelog list page (/changelog/[slug]) with a Linear-style feed, tag filter, date grouping, and inline entry expansion that updates the browser URL without a reload.frontend
Added an SEO-friendly entry page (/changelog/[slug]/entries/[id]) with article Open Graph/Twitter tags and a canonical link.frontend
Added a full-page password gate for visibility='private' changelogs that shows a branded unlock UI when the viewer lacks a valid cookie.frontend
API
Added public REST endpoints: GET /v1/changelog/:slug (list) and GET /v1/changelog/:slug/entries/:id (single entry) that return published entries without authentication.backend
Added POST /api/changelog/[slug]/unlock which verifies a supplied password against the stored bcrypt hash and sets a 24‑hour HttpOnly cookie on success.backend
Updated PATCH /api/projects/[slug]/settings to accept a plain-text visibility_password and store only a bcrypt hash (bcrypt rounds = 10).backend
Improvements
Added buildChangelogUrl() to consistently build canonical subdomain URLs in production and path-based URLs in development.frontend
Added groupEntriesByMonth() utility and used it to render date-grouped sections in the public feed; preserved input ordering within each group.frontend
Updated Project Settings UI to allow setting a changelog access password when visibility is set to private and showed the canonical public URL for each project.frontend
Installed bcryptjs and its types to support server-side password hashing and verification.backend
Updated middleware to exempt /changelog/* from Clerk auth so public changelog paths are bypassed when accessed directly under suprlogs.com.auth
Security
Hashed changelog visibility passwords with bcrypt before saving and never stored plain-text passwords.security
Set an HttpOnly, same-site, secure cookie when unlocking private changelogs to reduce exposure of credential data in the browser.auth
Documentation
Added NEXT_PUBLIC_CHANGELOG_DOMAIN to .env files, turbo.json, and README and documented how subdomain routing works and how to configure Vercel wildcard domains.devops
Documented the public changelog feature and implementation details in docs/changelog.md.docs
Testing
Added 14 tests (8 middleware/subdomain and 6 date-grouping); all web tests (57) passed.frontend
Added repository search and improved repo selection UI
Repository search in the repo selector — Added a search input to the repository selection step so users can quickly find GitHub repositories by name or description. Results update as you type and the list shows when no matches are found.
New Features
Added a search input that filtered GitHub repositories by name or description in the repository selection step.frontend
Improvements
Updated the repository list to display filtered results dynamically and show a clear “No repositories found” message when there are no matches.frontend
Improved the selection UI with clearer highlighting for the chosen repository and smoother interaction when picking a repo.frontend
Fix Clerk profile routing and support users without organizations
Clerk profile UI no longer breaks routing or crashes for users without an organization — Profile components now use hash-based routing so Clerk's internal navigation won't conflict with Next.js paths. The organization settings page now shows a "Create organization" prompt for users who don't have an active org, and users are no longer forced through an onboarding redirect.
Bug Fixes
Added routing="hash" to Clerk's OrganizationProfile and UserProfile components to avoid path-based navigation conflicts with Next.js.frontend
Updated the organization settings page to guard against missing organizations: it now renders a CreateOrganization prompt instead of failing when no org is active.frontend
Removed the mandatory redirect to /app/onboarding when an organization ID was absent; projects are now scoped to the user when no org is active.frontend
Documentation
Updated the changelog to describe the routing fix and the org-less user behavior change.frontend
Initial monorepo scaffold with API, Web, Docs, and core packages
Project scaffolded: apps, packages, docs, and developer rules — Added a complete Turborepo monorepo for SuprLogs including an Express API, Next.js web app with Clerk auth, a Mintlify docs site, shared packages (database, cache, auth, providers, changelog pipeline, Inngest, webhooks), CI/dev tooling, and comprehensive onboarding & rules documentation to help contributors get started.
New Features
Added API server (Express) with health endpoint and Inngest mount.backend
Added Web app (Next.js) with marketing pages, dashboard placeholders, and Clerk sign-in / sign-up flows.frontend
Published Docs site (Mintlify) with API reference, quickstart, and OpenAPI spec.integrations
Added comprehensive onboarding and rule documents (.cursor/commands and .cursor/rules) covering auth, web, API integration, error handling, LLM, Inngest, testing, security, logging, and project structure.integrations
Included README, example env files, docs pages (quickstart, API reference, API keys), and inline examples to help contributors run and extend the project locally.
Improvements & Tooling
Added developer tooling and configs: pnpm workspaces, turbo, TypeScript, ESLint, Prettier, Tailwind, and project-level scripts for dev/build/test.devops
Added local infra support: docker-compose for Redis, Supabase local config and seed, and .env example files for local setup.devops
Added utility scripts (generate OpenAPI stub), CI-friendly turbo config, and workspace package manifests for easy local development.devops
Database & Auth
Added Supabase configuration, local migration placeholders, and database package with Supabase client helpers.database
Added auth helpers and Clerk integration placeholders (auth package, middleware, and sign-in/sign-up UI wiring).auth
Renamed SuprLog to SuprLogs; fixed env loading for Clerk and aligned dev ports
Project rebrand: SuprLog → SuprLogs — All user-facing names, docs, and domains were updated to SuprLogs. This includes the dashboard, API docs, support/contact emails, Docker container name, and package display names. You should now see SuprLogs across the site, docs, and hosted links (e.g. suprlogs.com).
Branding and packaging
Updated display copy and sites from “SuprLog” to “SuprLogs” across the web app, docs, and marketing text so product names and pages match the new brand.frontend
Renamed internal packages and published package names (`@suprlog/*` → `@suprlogs/*`) and updated repo/package identifiers to `suprlogs-mono` so workspace and tooling reflect the new name.backend
Updated Docker and local tooling references (container names and npm scripts) to use `suprlogs-redis` and `suprlogs-mono` for consistency during local development.devops
Authentication and environment loading
Fixed environment loading for the web app so root-level env files are loaded in sequence; root `.env.local` now correctly overrides other files so Clerk keys (e.g. CLERK_SECRET_KEY) are picked up during local dev.auth
Added optional load of environment files like `.env.development.local` when present and ensured `.env.development` and `.env.local` are loaded with override so root secrets take precedence.frontend
Local development configuration
Aligned reference ports and Supabase project id in local config: Supabase API on 4700, DB on 4702, Redis on 4703, Inngest on 4707, and the web app on 4715 — update any local scripts or docs you rely on.database
API and docs
Updated OpenAPI, docs metadata, and hosted links to use SuprLogs names and production URLs (api.suprlogs.com) so API docs and generated clients reflect the rebrand.backend
Documentation
Updated README and onboarding instructions to explain that env files are loaded from the monorepo root in order (`.env` → `.env.development`/`.env.production` → `.env.local`) and that Clerk secrets should be set in the root `.env.local`.
Engaging full‑screen intro video with fade and tap controls — A new full‑screen introduction video now appears on the Marketing page. The video supports smooth audio/video fade‑outs, a tap-to-play overlay for devices that require a gesture for sound, and can be replayed from the site header.
New Features
Added the HomeIntroVideo component to play a full-screen introduction video on the Marketing page with fade effects and gesture controls.frontend
Added the home-hero.mp4 video asset used for the new intro.frontend
Improvements
Updated middleware routing to allow common video file types (mp4, webm, ogg) so the video asset can be served correctly.backend
Updated the site header so clicking the logo will replay the intro video.frontend
Fix quote rendering in changelog and project dialogs
Bug Fixes
Replaced plain double quotes with HTML entities (") in the Changelog feed and Project Settings dialogs so quotes render consistently and correctly in the UI.frontend
Ignore reserved “new” project route to stop phantom sidebar highlighting
Bug Fixes
Excluded the reserved path segment "new" from project-slug extraction so the sidebar no longer highlights a non-existent project for /app/projects/new and its child routes.frontend
Added unit tests for /app/projects/new and /app/projects/new/settings to prevent regressions.frontend
Allow API and internal Next.js requests to bypass rewrite; fix project settings save
Subdomain pages now let API and Next.js internal requests pass through — Requests to paths starting with /api/ or /_next/ are no longer rewritten for subdomain pages, so relative fetch() calls from those pages reach their intended Next.js route handlers unmodified.
Routing & Middleware
Allowed requests to /api/ and /_next/ to pass through the middleware without rewriting so relative fetches from subdomain pages reach the correct Next.js handlers.frontend
Project Settings API
Resolved the internal user ID before saving project settings to ensure the correct user is recorded and improve data integrity.backend
User Interface
Updated public URL display in project creation and settings to use the shared buildChangelogUrl utility for consistent formatting across the app.frontend
Fix social sign-in buttons visibility in dark mode
Bug Fixes
Fixed social sign-in and sign-up buttons so they render with a white background, dark text, and visible border in dark mode for improved readability and consistent appearance.frontend
Fixed an issue where project publish settings were ignored. The resolver now reads the project's publish_mode ('auto' or 'approval_required') and correctly applies auto-publish and approval-required behavior instead of falling back to drafts.backend
Added GitHub and Clerk webhook handlers with Inngest pipeline stubs
Clerk and GitHub webhooks: receive, verify, and queue events — The API now accepts signed webhooks from Clerk and GitHub, verifies signatures, persists GitHub events for audit, and queues verified events to background pipelines so external account and push activity can be processed reliably.
Typed Inngest events and stub pipeline functions — Typed events and two stub Inngest functions were added to register end-to-end pipelines: a historical sync for new GitHub installations and a per-project push-processing pipeline. Both are logged stubs now and ready for full implementation.
New Features
Added /webhooks endpoints for Clerk and GitHub to the API and mounted them with raw-body middleware so signatures can be verified.backend
Added @suprlogs/webhooks package with production-ready Clerk (Svix HMAC) and GitHub (HMAC-SHA256 with timing-safe compare) verification helpers and typed webhook payloads.integrations
Added typed Inngest events and two stub functions (github/installation.created and github/push.received) so background pipelines are registered and can be invoked end-to-end.backend
Persisted incoming GitHub webhook payloads to an audit table (best-effort) and queued installation/push events to Inngest for downstream processing.database
Improvements
Validated required webhook environment variables (CLERK_WEBHOOK_SIGNING_SECRET, GITHUB_WEBHOOK_SECRET) at startup and threw a clear error if missing to avoid silent misconfiguration.devops
Ensured webhook routes use express.raw() before JSON parsing to preserve the raw request body for signature verification.backend
Added ProjectRepository.findByRepo and exported Json type from @suprlogs/database to support repo→project lookups from push webhooks.database
Updated package and dev dependencies (vitest, supertest) and added e2e/unit tests covering signature verification, happy-path handlers, and resilience when DB writes fail.
Fixed ngrok:start port to match the API server port (4704) and added GITHUB_WEBHOOK_SECRET to turbo globalEnv.devops
Security
Implemented timing-safe HMAC verification for GitHub webhooks and Svix-backed verification for Clerk webhooks to protect against tampering and replay.auth
API
Returned consistent 200 responses for valid webhook deliveries even when downstream DB writes fail, preventing sender retries while still logging errors for investigation.backend
Documentation
Updated changelog and package metadata to document the new webhook verification utilities, events, and pipeline stubs.
Added favicon, Open Graph image, improved metadata, and cookie consent manager
Cookie consent banner and preferences — A new, accessible cookie consent experience was added so visitors can accept or reject cookie types, open a preferences modal to customize choices, and follow links to the Privacy and Cookie Policy pages. Choices are remembered and won’t repeatedly prompt returning visitors.
New Features
Added an on-site cookie consent manager (banner + preferences modal) so visitors can control which cookie categories they accept or reject.frontend
Integrated Silktide consent scripts and styles to manage consent behavior and callbacks.integrations
Improvements
Added a favicon and web app manifest so the site displays a proper icon on browsers and mobile devices.frontend
Added an Open Graph image for richer previews when sharing links on social media.frontend
Updated site metadata (keywords, publisher, robots, icons, manifest, and social meta) to improve SEO and how the site appears in search results and link previews.frontend
Documentation
Added page metadata (title and description) for the Privacy Policy and Terms pages so they show correct titles in search and link previews.frontend
Added environment config files and VS Code editor associations
Improvements
Added shared and environment-specific configuration files (.env, .env.development, .env.production) to centralize app settings and provide sensible defaults for development and production.devops
Provided local development defaults (local Supabase, PostgreSQL, Redis, Inngest, and test Clerk keys) to simplify running SuprLogs locally.backend
Added production placeholders and recommended override behavior so deployment environments can supply real service URLs and secrets.devops
Added VS Code editor associations for .csv, .tsv, and .parquet files to open in the DuckDB data viewer for easier inspection of data files.frontend
Documentation
Documented that secrets (for example CLERK_SECRET_KEY, CLERK_WEBHOOK_SECRET, and production service keys) must not be committed and should be placed in .env.local or in deployment environment variables.
Removed the temporary limit that capped repository syncs to 3 commits; sync now processes all unprocessed commits (oldest first) and fans out an event for each commit.backend
Performance
Improved sync reliability and completeness by eliminating the artificial commit cap and removing the related capped metrics.backend
CMS workflow: entry editor, status actions, and settings save
Full entry editor and workflow — You can now open a full entry editor (split-pane Markdown editor + live preview, editable title, metadata sidebar, and status action bar) at /app/projects/[slug]/entries/[id]. Project settings were also wired so General and Changelog tabs save, and the Danger Zone delete flow is functional.
New Features
Added a full entry detail editor at /app/projects/[slug]/entries/[id] with an editable title, split-pane Markdown editor (live preview), metadata sidebar, status action bar (Approve/Reject/Publish/Archive), and a Reject dialog.frontend
Added status filter tabs (All/Draft/Pending/Published/Archived/Rejected) to the entry list and an inline Approve quick-action for pending_approval entries.frontend
Wired the Project Settings UI so General and Changelog tabs persist changes and Danger Zone supports project deletion with slug confirmation.frontend
API
Added entry API routes: GET and PATCH /api/projects/[slug]/entries/[id] and POST routes for approve, reject (optional reason), publish, and archive.backend
Added project settings and management routes: PATCH /api/projects/[slug]/settings, PATCH /api/projects/[slug] (update name), and DELETE /api/projects/[slug] (hard delete).backend
Improvements
Updated entry list and hooks: useEntries accepted a status filter and query keys were scoped per tab to avoid flash and improve caching.frontend
Added client-side entry hooks and mutations (useEntry, useEntryMutations) that update caches and invalidate lists after changes.frontend
Used react-markdown + remark-gfm for the live preview and added a debounced auto-save in the editor (1.5s).frontend
Seeded server-rendered entry data into TanStack Query to remove loading flashes when opening the editor.frontend
Database
Extended ChangelogEntryRepository.updateMetadata to include the title so metadata edits could be saved without touching content.database
Added ProjectRepository.update(id, fields) to allow updating mutable project fields (name); DELETE now hard-deletes projects and related data via API.database
Testing
Added 13 tests covering action bar logic and settings schema validation; all web and database tests passed.
Add GitHub configuration link to project creation flow
Improvements
Added a link in the Project Creation Wizard to the GitHub installation settings so users can open the installation page and manage which repositories the app can access.frontend
Updated the Select Repository step to display an “Update your sharing settings” link when only one repo is visible, making it easier for users to adjust repository access on GitHub.frontend
Prioritized project owner instructions in generated prompts
Improvements
Updated the prompt builder to prepend custom project-owner system instructions so those instructions are applied first and take priority over default guidance.backend
Updated and renamed unit tests to reflect the new behavior and verify the expected instruction order.backend
Local dev GitHub integration, project creation flow, org management, and UI polish
Easier project setup with a GitHub branch picker and live slug preview — The project creation flow now lists repository branches (via a new branches API and hook), replaces the tracked-branch text field with a branch dropdown, and shows a live public-URL preview and helper text for the slug so you can finish setup faster and with fewer mistakes.
Consistent primary CTA and UI polish across the app — A new reusable PrimaryButton (neobrutalist acid-green style, hover box-shadow shift, supports asChild) was added and applied across onboarding, the project wizard, and dashboard CTAs for a consistent, prominent action style.
New Features
Added GET /v1/github/repos/:installationId/branches to fetch repository branches for a GitHub App installation.backend
Added GithubClient.listBranches and GithubBranch type to list and type branches from GitHub.integrations
Added useGithubBranches TanStack Query hook wired to the new branches API for client-side branch lists.frontend
Replaced tracked-branch text input with a Select dropdown populated from the GitHub branches API (with loading and empty states).frontend
Added live URL preview and format helper text for the project slug field so users can see their public URL while typing.frontend
Auto-selected the repository in the Select Repo step when only one repo is accessible to the installation to reduce clicks.frontend
Improvements
Applied the new PrimaryButton across onboarding, project creation, and dashboard CTAs for consistent styling.frontend
Added per-option descriptions to the visibility RadioGroup (Public, Unlisted, Private) to clarify sharing behaviour.frontend
Added a tsc --watch "dev" script to internal packages so Turborepo hot-reloads local package changes during pnpm dev.devops
Renamed a Supabase migration file to a clearer name (vault_helpers.sql).database
API
Updated POST /v1/projects to accept clerkOwnerId (Clerk user/org ID) and resolve the internal UUID server-side before inserting the project.backend
Changed GET /v1/github/callback to redirect to /app/projects/new?installation_id=<uuid> and to accept x-clerk-user-id to populate installed_by on installations.backend
Fixed GET /api/github/installations to resolve Clerk userId to an internal UUID before querying installations and return an empty array when the user is not present.backend
Bug Fixes
Fixed environment loading to use override: true for .env.local so local secrets override placeholder values.devops
Fixed Clerk webhook handleOrgCreated to immediately upsert an admin membership for the org creator to avoid race conditions.auth
Fixed Clerk webhook handleOrgDeleted to hard-delete the organization row (and cascade membership deletes) instead of a no-op.auth
Fixed ConnectGitHubStep to pass the internal installation UUID (id) instead of the GitHub integer installation_id so downstream requests resolve correctly.frontend
Fixed useGithubRepos to map camelCase API response fields to the snake_case shape expected by the UI so the repo dropdown loads correctly.frontend
Fixed the GitHub callback page to move redirect() outside the try/catch so Next.js redirect behaviour is not swallowed as an error.frontend
Fixed SidebarWorkspaceNav active-link detection to use strict pathname equality to avoid incorrect highlights.frontend
Made OrganizationRepository.addMember idempotent by upserting on (org_id, user_id) to tolerate duplicate membership events.database
Removed invalid JavaScript null-coalescing (??) from Inngest function CEL expressions so functions register correctly in the local dev server.backend
Removed DEMO_CLERK_USER_ID from env files and corrected Supabase JWT key formats in .env.development for local dev consistency.devops
Web app: App shell, onboarding, GitHub connect, and project UI (Phase 3)
New authenticated app shell, onboarding flow, and project workflows — Redesigned the authenticated experience with a persistent left sidebar, added a 4‑step onboarding wizard, a 3‑step project creation flow (GitHub install → repo select → project config), and a project dashboard with entry lists and project settings. GitHub App install redirects are handled and tied into project creation.
New Features
Added a persistent left sidebar app shell with a ProjectSwitcher, project‑scoped nav (Home / Settings / Analytics / Editor / Branding) and workspace nav (Organization, Billing, Account).frontend
Added a 4‑step onboarding wizard: Welcome → Create workspace (Clerk) → Connect GitHub → Done, with progress and URL-driven step state.frontend
Added a 3‑step project creation wizard: Connect GitHub (auto-skip if installation exists) → Select repository → Configure project (form validation with Zod and RHF).frontend
Added project dashboard (ProjectGrid + ProjectCard), project home (entry list with EntryCard and skeleton loading) and slim project header showing repo and sync status.frontend
Added project settings page with 4 tabs (General, GitHub, Changelog, Danger Zone) and placeholder Billing page; analytics/editor/branding pages were added as shared "Coming Soon" stubs.frontend
Integrated Clerk organization and user profile UIs into app settings to manage orgs and members from the web app.auth
API & Server
Added Next.js route handlers for server-backed reads: GET /api/projects, GET /api/projects/[slug], GET /api/projects/[slug]/entries and GET /api/github/installations.backend
Added a GitHub callback page (/github/callback) that calls the Express API callback and redirects users into the web app project creation flow.integrations
Added a lightweight database helper (getDb) and added @suprlogs/database dependency so server components and API routes can load projects and settings from the DB.database
Added client hooks for data fetching: useProjects, useEntries, useGithubInstallations, and useGithubRepos (TanStack Query).frontend
Improvements
Redesigned the server layout to load the project list and pass initial projects into the Sidebar to avoid a loading flash.frontend
Implemented extractActiveSlug(util) and updated Sidebar to use usePathname() to determine the active project context.frontend
Installed a set of shared UI primitives (Shadcn + Radix pieces) and added multiple UI components (badge, dialog, popover, select, tabs, progress, etc.) to standardize the app look-and-feel.frontend
Updated middleware to exempt /api/* routes from Clerk redirect so API handlers can return 401/403 directly instead of being redirected to sign-in.auth
Added client-side UX polish: skeleton loading, status badges, progress bars, and consistent neobrutalist styling across new pages.frontend
Documentation & Configuration
Updated README to instruct using the web app callback URL (/github/callback) and to document new environment variables (NEXT_PUBLIC_API_URL, API_URL, NEXT_PUBLIC_GITHUB_APP_SLUG).docs
Added NEXT_PUBLIC_GITHUB_APP_SLUG to .env and NEXT_PUBLIC_API_URL / API_URL to .env.development to support browser-side GitHub install links and local API calls.docs
Updated package.json and tooling for the web app: added vitest support and test scripts for the new web tests.devops
Action Required
Updated GitHub App callback expectations — update your GitHub App's callback URL to the web app (/github/callback) and set NEXT_PUBLIC_API_URL and NEXT_PUBLIC_GITHUB_APP_SLUG in your web app environment so the install flow and API calls work correctly.integrations
Resolved Clerk org/user IDs to internal UUIDs when loading projects
Bug Fixes
Fixed an issue where project lists were empty when using Clerk org or user IDs. The app now looks up the internal UUID (via findOrgByClerkId/findByClerkId) before querying projects, so projects created with internal UUID owner_id are correctly returned in the API, app layout, and dashboard.backend
Add GitHub App install flow and LLM-powered changelog pipeline
LLM-generated changelogs — Commits are now analyzed by an LLM (OpenAI or Anthropic) to produce structured changelog entries. The pipeline filters noisy files, renders publishable Markdown, and persists entries with configurable publish/approval settings.
API
Added versioned endpoints to connect GitHub and projects: GET /v1/github/callback (post-install handler), GET /v1/github/repos/:installationId (repo picker), and POST /v1/projects (create project + queue sync).backend
Background processing
Queued full-history repo syncs and per-commit processing so changelogs are generated in the background; events include a priority flag resolved from owner entitlements.devops
GitHub integration
Implemented GitHub App authentication (RS256 JWT + in-memory token cache) and repository/commit listing to reliably fetch commit metadata and diffs.integrations
LLM & secrets
Built provider-agnostic LLM calls with OpenAI structured output and Anthropic support, plus Vault helpers and a Vault client to support BYOK (user-owned keys).backend
Documentation
Updated README and PRD with GitHub App callback setup, required env vars, testing commands, and design notes for the changelog pipeline.
Changelog UI now follows your theme — Replaced hardcoded colors with semantic tokens so the public changelog respects light, dark, and system theme preferences.
Bug Fixes
Replaced hardcoded colors (e.g. bg-white, border-black, border-black/10) across the public changelog with semantic tokens (bg-background, border-border, border-foreground). This fixed contrast and legibility issues in dark mode and ensured the ThemeProvider's system/dark/light preference is correctly applied.frontend
Add “Re‑sync All Commits” action to Project Danger Zone
Manual full re‑sync from Project Settings (Danger Zone) — Added a one‑click, manual re‑sync that permanently deletes all current changelog entries and re-queues the full commit history for processing. The action is surfaced in the Danger Zone with orange warning styling and a confirmation dialog to prevent accidental use.
New Features
Added a Re‑sync All Commits control to the Project Settings Danger Zone with prominent orange warning styling and a confirmation dialog to confirm the destructive operation.frontend
API
Added POST /v1/projects/:projectId/resync to hard‑delete all changelog entries, reset commits to unprocessed, and enqueue a repo/sync.requested event to regenerate entries from the full commit history.backend
Improvements
Added CommitRepository.resetProcessed to mark all commits as unprocessed before a full re‑sync.database
Improvements
Added ChangelogEntryRepository.deleteByProject to hard‑delete all changelog entries for a project as part of the re‑sync flow.database
Fixed gpt-5-mini 400 error by removing unsupported temperature parameter
Bug Fixes
Removed the unsupported temperature parameter from OpenAI (gpt-5-mini) calls, which prevented 400 Bad Request errors. Structured JSON output (json_schema) remained unaffected and required no action from users.integrations
Added database repository layer with DatabaseService, 16 repositories, and tests
Database facade and repositories — Added a DatabaseService facade and a lazy `db` singleton that expose 16 fully typed repository classes covering every table in the SuprLogs schema (projects, commits, changelog entries, prompts, entitlements, subscribers, audit, etc.).
Comprehensive tests and type safety — Added 136 Vitest unit tests (all passing) and hand-written TypeScript types for the full schema; TypeScript compiled with zero errors.
Repository layer
Added DatabaseService and a lazy `db` singleton that instantiate and expose repository classes for every table.database
Implemented 16 repositories with explicit input/output interfaces and business methods (entry publish/approve/reject, prompt versioning, entitlement resolution, subscriber workflows, audit logs, etc.).backend
Service client
Added createDatabaseClient() factory to create a service-role Supabase client (server-only; requires SUPABASE_URL and SUPABASE_SERVICE_KEY).backend
Testing & quality
Added 16 Vitest test files with 136 unit tests covering each repository; all tests passed and package TypeScript typecheck produced no errors.devops
Updated packages/database/package.json with test scripts and devDependencies for vitest and @vitest/ui.devops
Types & schema
Added a hand-written src/types.ts that defines the full Database type (Row/Insert/Update/Relationships) for all 19 tables and referenced the schema docs.database
Updated changelog and documentation references to include the new repository layer and schema details.
Full Supabase schema, seed data, docs, and env template
Complete Supabase schema and docs — Added the full Supabase schema, migrations, seed data, and a human-readable database reference so projects can be run and inspected locally or by CI.
Database schema
Added a complete Supabase schema (identity, entitlements, Vault, GitHub, projects, commits, changelog entries, CMS tables, prompts, audit) and supporting migrations.database
Included RLS policies, triggers, indexes and FK constraints to support secure, production-like local development.database
Seed data & prompts
Populated seed data for entitlement catalog, system changelog section types (sections + components), and five system prompts to bootstrap generation and local testing.database
Documentation
Published a Product Requirements Document (docs/prd.md), a full database reference (docs/database.md) with column-by-column details, and a product backlog (docs/backlog.md).docs
Backlog documents planned v1+ items (reactions, comments, MCP server, analytics, integrations, RSS, cookie policy) so roadmap decisions are clear.docs
Environment template
Updated .env.local.example with GitHub App keys, Svix API key, and SuprSend workspace keys to simplify repo connection and outbound webhook setup.integrations
Developer tooling
Added TypeScript types and a lazy Supabase client singleton (packages/database/src/index.ts) to improve developer experience and keep types in sync with the schema.backend
Open local changelogs at [slug].localhost:PORT — You can now visit changelogs in development using a subdomain like `http://my-project.localhost:4715`. The app rewrites those requests to the correct changelog page, matching production subdomain behavior. Modern browsers resolve `*.localhost` to `127.0.0.1` natively, so no /etc/hosts changes are required.
Improvements
Enabled subdomain routing for changelogs in development so `http://[slug].localhost:PORT` maps to the corresponding changelog, matching production behavior.frontend
Updated the changelog URL builder to use the same subdomain pattern in both development and production (removed the previous path-based fallback).frontend
Clarified local behavior: modern browsers resolve `*.localhost` to `127.0.0.1`, so no `/etc/hosts` edits are necessary for local testing.devops
Documentation
Updated local development environment notes to document the new localhost subdomain routing and the absence of required hosts file changes.devops
Added SQL functions to create, read, and update vault secrets
Manage vault secrets from SQL — Added public RPC functions that let you create, read, and update secrets stored in the vault schema, enabling secure programmatic secret management from SQL clients and automation scripts.
New Features
Added three public RPC functions: vault_create_secret, vault_read_secret, and vault_update_secret to create, retrieve, and update secrets in the vault.database
API
Exposed new SQL-level APIs (RPC functions) for secret management that run with SECURITY DEFINER in the vault schema.database
Fixed LLM schema validation error and temporarily capped repo sync to 3 commits
Prevented 400 InvalidSchema errors on LLM calls — Fixed an issue where the OpenAI JSON schema declared a `body` field but didn’t mark it required, causing a 400 InvalidSchema on every LLM request. The schema now requires `body` for headline items; the LLM will output an empty string when no description is needed.
Bug Fixes
Fixed OpenAI schema validation by adding `body` to required fields for headline items, stopping 400 errors on LLM calls.integrations
Improvements
Added a temporary cap of 3 commits per repo sync to limit fan-out while validating the end-to-end LLM pipeline; this cap will be removed once generation is stable.backend
New onboarding step to set workspace LLM defaults — Added a new onboarding step that lets you pick a default LLM provider, model, and (optionally) provide an API key for the workspace. These workspace defaults are surfaced in a new Workspace LLM & Defaults settings page and are offered as the default source for new projects.
Project settings can inherit workspace defaults (or override them) — Projects can now inherit workspace LLM and visibility defaults, or keep per-project overrides. When a project is created we snapshot workspace defaults into the project so teams keep explicit control while benefiting from easier setup.
New Features
Added an onboarding LLM defaults step so new workspaces can set a default provider, model, and optional API key during setup.frontend
Added a Workspace LLM & Defaults settings page to view and change workspace-wide defaults and API keys.frontend
Added a project creation proxy API and client flows so the web app can create projects while preserving owner context.backend
Improvements
Enabled projects to inherit workspace settings (provider, model, publish mode, theme, visibility) via a new "Use workspace defaults" option in project settings.frontend
Snapshot workspace defaults into new projects at creation time so projects keep predictable settings even if workspace defaults change later.backend
Improved settings UX across workspace and project pages (visibility password handling, model selection, clearer source labels).frontend
Hid the main sidebar during the onboarding flow and added a cookie-based onboarding guard so users are guided through initial setup.frontend
Added client-side helpers and server routes to simplify selecting GitHub repos/branches from the UI (with proper caller context).frontend
Security
Hardened API routes by requiring and verifying caller identity (x-clerk-user-id) and denying GitHub installation access when the installation is not owned by the caller.auth
Stored visibility passwords hashed with bcrypt instead of plain text and updated create/update flows to hash passwords before saving.backend
Added a free-plan monthly commit cap check to worker processing to prevent unexpected LLM usage and surface a safe skip path when the cap is reached.backend
API
Added new API routes for workspace settings, onboarding LLM defaults, onboarding status, and project settings flags (including use_workspace_defaults).backend
Protected project resync and settings endpoints so only project owners or valid org members can perform actions.auth
Database
Added RBAC scaffolding: permission catalog and permission_grants tables plus a PermissionRepository to manage grants.database
Implemented org teardown handling: entitlements and permission grants are revoked, project settings and projects are cleaned up when an organization is deleted.database
Added project_settings.deleteAllForSubject and a changelog entry count query used to enforce monthly free-plan caps.database
Integrations
GitHub connect flows now ensure the requesting user is the installer and proxy GitHub list requests through authenticated client endpoints.integrations
Tests & Misc
Updated tests and prompt-builder naming to reflect project-scoped prompts and system prompt semantics.
Claim orphaned GitHub installations and add error boundary to project creation
Project creation wizard now shows a helpful error screen instead of crashing — Added a reusable ErrorBoundary component and wrapped the project creation flow so rendering errors are caught and shown as a readable error card with a "Try again" action, instead of a blank page.
Orphaned GitHub installations are now claimed automatically — When a user has no recorded installations, the system now attempts to claim any unassigned GitHub installations (created via direct API callbacks) and associate them with the user to make GitHub setup more reliable.
API
Updated the GET /api/github/installations handler to claim orphaned installations (installed_by was null) when none were found for the user.integrations
Added server-side error logging to the onboarding LLM defaults endpoint to aid debugging.backend
Improvements
Added a generic ErrorBoundary React component and wrapped the ProjectCreationWizard so UI errors display a readable card and a retry action.frontend
Added a database repository method to claim unclaimed GitHub installations and used it from the installations handler.database
Fix rendering conflict for sign-in and sign-up pages
Bug Fixes
Removed a conflicting force-static setting from the sign-in and sign-up page layouts so they now follow the application's root dynamic rendering. This fixed inconsistent rendering/caching behavior on authentication pages.auth
Per-user LLM configuration and project LLM settings
Save and use your own OpenAI/Anthropic API keys per user or per project — Users can now supply their own OpenAI or Anthropic API keys (BYOK). Keys are stored securely in Vault, returned to the UI only in masked form, and can be selected per project alongside provider and model choices to customize changelog generation.
New Features
Added backend endpoints to manage per-user LLM configurations (GET and POST) for OpenAI and Anthropic providers.backend
Added project-level LLM settings and UI controls so teams can choose provider, pick a model, and optionally supply a per-project API key.frontend
API
Introduced /v1/user/llm-config (GET/POST) and a Next.js proxy route to forward the authenticated Clerk user ID when storing or retrieving keys.backend
Improvements
Updated project settings PATCH to accept llm_provider, llm_model, and llm_api_key and to persist provider/model values for each project.backend
Updated ProjectSettingsForm to show provider and model selectors, display masked existing keys, and let users submit or replace an optional BYOK API key.frontend
Added a small client-side model list library for OpenAI and Anthropic so model options and defaults are consistent in the UI.frontend
Security
Stored BYOK API keys in Vault and never saved plain-text keys in the database; GET responses return only masked key fragments to the UI.backend
Docs: README updated with clearer env setup, ports, and webhook configuration
Documentation
Updated the project description to mention LLM-based changelog analysis and corrected the hosted subdomain example to suprlogs.com.
Clarified the apps list to describe the API server responsibilities (health, Inngest, Clerk and GitHub webhooks) and updated the web dashboard tech notes.backend
Clarified environment setup: copy .env examples to the monorepo root, store secrets in root .env.local, and documented the env load order for each app.devops
Clarified start and build commands and explained what pnpm services:start and pnpm dev do for local development.devops
Added a clear ports table (4700–4716) and troubleshooting tips for address-in-use errors and Supabase internal ports.devops
Added detailed webhook configuration for Clerk and GitHub including endpoint paths, signature header verification, and required environment variables.integrations
Documented local webhook testing with ngrok and step-by-step setup for Clerk webhooks and GitHub App webhooks, including how to store signing secrets and private keys in env vars.integrations
Documented production deployment to Railway with instructions for setting service root, build/start commands, required environment variables, custom domain setup, and Inngest registration.devops
Added testing and database workflow commands (pnpm test, pnpm db:reset, pnpm db:studio, pnpm db:types) and migration guidance for local Supabase.database
Improved README structure and quickstart flow with separators and clearer step ordering for new contributors.
Fix workspace settings crash and restore project visibility
Stopped workspace settings crashes and made projects reliably visible — Prevented a server-side bundling issue that could crash workspace settings and restored consistent project visibility across organization and user contexts in the dashboard and project switcher.
Bug Fixes
Prevented workspace settings from crashing by forcing Node.js to resolve certain server packages (pino and related modules) at runtime instead of bundling them, fixing worker file resolution with pnpm layouts.devops
Avoided bundling-related runtime errors in settings PATCH by dynamically importing bcrypt at runtime so the server bundle no longer fails to locate native worker files.backend
Restored project visibility by merging and de-duplicating organization and user projects so projects appear correctly in the dashboard and project switcher regardless of org/user context.frontend