-
Clarify submit form "Component Directory Content" is optional (2026-05-27 20:12 UTC)
- User reported confusion when submitting without clicking "Generate Content." Investigated backend: all generated content fields are
v.optional()in schema, action args, and insert mutation. No server validation requires them. - Fix: added "(optional)" label and updated helper text to explain users can skip and add content later from their profile.
- Files:
src/pages/SubmitForm.tsx,changelog.md,task.md,files.md - Verification:
ReadLintsclean;npm run buildpassed.
- User reported confusion when submitting without clicking "Generate Content." Investigated backend: all generated content fields are
-
Profile edit thumbnail upload and replace (2026-05-19 UTC)
- Users can add, replace, or remove thumbnails from Profile edit (
ProfileEditSubmission.tsx, linked from Profile Edit button). - Backend:
clearThumbnailmutation;getMySubmissionForEditincludes thumbnail fields. - Files:
convex/packages.ts,src/pages/ProfileEditSubmission.tsx,src/pages/Profile.tsx,files.md,changelog.md,task.md - Verification:
npm run buildpassed.
- Users can add, replace, or remove thumbnails from Profile edit (
-
Submit form optional thumbnail upload with generation protection (2026-05-19 UTC)
- Submitters can upload 16:9 thumbnails on
SubmitForm.tsx; uploads are protected from auto and manual generation viathumbnailUploadedByUser. - Admin
ComponentDetailsEditorhide-thumbnail checkbox now persists immediately (matches Admin inline Hide Thumb toggle). - Profile
SubmissionCardshowsthumbnailUrlfromgetMySubmissionswith no extra client changes. - Files:
convex/schema.ts,convex/packages.ts,convex/thumbnails.ts,convex/thumbnailGenerator.ts,src/pages/SubmitForm.tsx,src/components/ComponentDetailsEditor.tsx,src/pages/Admin.tsx,files.md,changelog.md,task.md - Verification:
ReadLintsclean on edited frontend files;npx tsc --noEmit -p convex/tsconfig.jsonpassed;npm run buildpassed (Netlifynpm run buildstep).
- Submitters can upload 16:9 thumbnails on
-
Restore GitHub owner avatar URLs for organizations (2026-05-15 04:34 UTC)
- Root cause: author avatar generation used
https://avatars.githubusercontent.com/{owner}, which can fail for organization owners such asget-convex. - Fix: restored
https://github.com/{owner}.pngin new submission author data, admin auto-fill, and the avatar URL migration path. - Guardrail: documented that owner avatars should not be changed back to the CDN username format.
- Files:
convex/packages.ts,task.md,changelog.md,files.md - Verification:
ReadLintsclean on edited files;npx tsc --noEmit -p convex/tsconfig.jsonpassed.
- Root cause: author avatar generation used
-
Add Auto AI Review completion status to Slack when enabled (2026-05-04 18:50 UTC)
- PRD:
prds/auto-ai-review-slack-status.md - Fix:
convex/packages.tsnow sends one grouped completion Slack message whenautoAiReviewis enabled and both security scan and AI review have terminal results. IfautoAiReviewis off, the existing security-only Slack completion message still sends unchanged. - Files:
convex/packages.ts,prds/auto-ai-review-slack-status.md,task.md,changelog.md,files.md - Verification:
ReadLintsclean onconvex/packages.ts;npx tsc --noEmit -p convex/tsconfig.jsonpassed;npx netlify build --offline --context productionpassed.
- PRD:
-
Move related components below the sidebar on mobile detail pages (2026-05-04 18:49 UTC)
- Fix:
src/pages/ComponentDetail.tsxnow renders Related Components in the main content column on desktop and after the sidebar on mobile, so narrow screens read main content, sidebar, then related components. - Files:
src/pages/ComponentDetail.tsx,files.md,task.md,changelog.md - Verification:
ReadLintsclean onsrc/pages/ComponentDetail.tsxandfiles.md;npx tsc -p . --noEmit --pretty falsepassed; Netlify build commandnpm run buildpassed.
- Fix:
Session updates complete on 2026-04-21 UTC.
-
Add Share this page dropdown to component detail sidebar (2026-04-21 17:37 UTC)
- Root cause: the component detail page had no way for visitors to share a component to social networks or copy the canonical URL from the sidebar.
- Fix: added a new inline
ShareThisPagecomponent insidesrc/pages/ComponentDetail.tsxrendered between the rating stars and the "How to get help" button. Items: Share on X, LinkedIn, Bluesky, Reddit, Mastodon, Other... (usesnavigator.sharewhen available, otherwise copies the URL), and Copy link. Styling matches the existing Markdown dropdown on the same page so it blends into the sidebar. Trigger carriesaria-expandedandaria-haspopup="menu", the menu usesrole="menu"withrole="menuitem"children, and ansr-onlyaria-live="polite"region announces "Link copied". Outside click and Escape close the menu. - Files:
src/pages/ComponentDetail.tsx,task.md,changelog.md,files.md - Verification:
ReadLintsclean onsrc/pages/ComponentDetail.tsx.
-
Add thumbnail sizing FAQ for component authors (2026-04-20 UTC)
- Root cause: component authors had no guidance on the expected thumbnail size for directory cards, so submissions shipped with inconsistent aspect ratios and resolutions.
- Fix: added a new FAQ entry in
src/components/FAQSection.tsxtitled "What size should my component thumbnail be?" that documents the 16:9 aspect ratio at 1536 x 864 pixels. The entry sits between "What are the requirements?" and "How are components sandboxed?" so authors see it alongside the core submission rules. FAQ now renders 12 items on Directory, CategoryPage, and SubmitForm. - Files:
src/components/FAQSection.tsx,task.md,changelog.md,files.md - Verification:
ReadLintsclean onsrc/components/FAQSection.tsx;npm run buildpassed.
-
Fix mobile settings and API layouts in admin dashboard (2026-04-17 23:04 UTC)
- PRD:
prds/admin-mobile-settings-api.md - Root cause: the admin settings and API views still had a few desktop-first mobile layouts. Category management rows packed too many badges into one line, the API tab still showed the generic submissions list, and the API analytics/access sections relied on dense row layouts plus a desktop table that compressed poorly on phones.
- Fix: updated
src/pages/Admin.tsxso the main admin tabs now scroll horizontally on mobile with readable labels, the sticky settings jump nav has cleaner spacing, category management rows wrap and stack safely, the submissions search/list stay hidden on theapitab, the API analytics endpoint rows are wrap-safe, recent requests switch to stacked mobile cards, and the grant/revoke rows stack cleanly on narrow screens. - Files:
src/pages/Admin.tsx,prds/admin-mobile-settings-api.md,task.md,changelog.md,files.md - Verification:
ReadLintsclean onsrc/pages/Admin.tsx;npm run buildpassed;npx netlify build --offline --context productionpassed.
- PRD:
-
Align desktop metadata rows in submit and admin tables (2026-04-17 22:26 UTC)
- Root cause: the desktop submission rows mixed plain text spans with badge components and icon links that used slightly different inline alignment and line-height behavior, so version, status, visibility, detail link, downloads, and date did not share one clean center line.
- Fix: updated
src/pages/Submit.tsxandsrc/pages/Admin.tsxto use consistentinline-flexcentering, tightened badge line-height, and added small desktop-only alignment wrappers for the metadata columns. Mobile layouts were left unchanged. - Files:
src/pages/Submit.tsx,src/pages/Admin.tsx,task.md,changelog.md,files.md - Verification:
ReadLintsclean on edited files;npm run buildpassed;npx netlify build --offline --context productionpassed with Edge Functions bundling.
-
Final mobile polish for expanded admin sections and Netlify build verification (2026-04-17 18:51 UTC)
- Root cause: after the width fixes, the expanded mobile admin sections were technically fitting but still felt too loose vertically, especially around the outer disclosure cards and the nested AI Review Results and Component Details surfaces. The session notes also needed one final sync that explicitly recorded the build result.
- Fix: tightened mobile padding on the outer disclosure shells in
src/pages/Admin.tsxand the nestedComponentDetailsEditorcard insrc/components/ComponentDetailsEditor.tsxusingp-2.5 sm:p-3, reduced some mobile-only top spacing (mt-2.5 sm:mt-3), and kept desktop spacing unchanged. Verified the production Netlify build withnpm run buildand it passed successfully. - Files:
src/pages/Admin.tsx,src/components/ComponentDetailsEditor.tsx,prds/admin-mobile-expanded-editors.md,TASK.md,changelog.md,files.md - Verification:
ReadLintsclean on edited files;npm run buildpassed (vite build, completed successfully).
-
Fix expanded admin section width on mobile at the parent package layout level (2026-04-17 18:51 UTC)
- Root cause: the expanded package shell in
src/pages/Admin.tsxusedflex flex-col ... items-starton mobile. Becauseitems-startdisables cross-axis stretching, the left content column (AuthorToggleSection,AiReviewResultsPanel,PackageComponentDetailsEditor,PackageMetadataEditor) sized itself to its contents instead of the card width. That made the expanded mobile sections appear wider than the viewport even after inner rows were made wrap-safe. - Fix: changed the expanded package wrapper from
items-starttoitems-stretch sm:items-startand addedw-fullto the left content column. On mobile, the expanded content column now stretches to the card width, so Package Metadata, AI Review Results, and Component Details all inherit the correct width constraint. Desktop layout stays the same. - Files:
src/pages/Admin.tsx,prds/admin-mobile-expanded-editors.md,TASK.md,changelog.md,files.md - Verification:
ReadLintsclean onsrc/pages/Admin.tsx.
- Root cause: the expanded package shell in
-
Make expanded admin editor sections mobile responsive (2026-04-17 17:52 UTC)
- PRD:
prds/admin-mobile-expanded-editors.md - Root cause: several expanded admin editors still used desktop-first horizontal layouts inside a narrow mobile card.
SubmitterEmailEditorhad a hardgrid-cols-2form and long read-only email rows without break guards.ComponentDetailsEditorused inline tool rows for author autofill, logo controls, thumbnail generation, thumbnail upload, badge markdown, and save or regenerate actions.AiReviewResultsPanelinsrc/pages/Admin.tsxkept the status icon, title, date, copy button, and chevron in one row with nomin-w-0, so the header and expanded body could exceed the viewport. - Fix: stacked or wrapped every dense mobile row while keeping desktop behavior.
SubmitterEmailEditornow usesgrid-cols-1 sm:grid-cols-2, wraps long read-only strings withbreak-wordsorbreak-all, and lets action buttons wrap.ComponentDetailsEditornow addsmin-w-0 overflow-hiddenat the root, stacks the save header on mobile, converts the author auto-fill row and thumbnail-generation row toflex-col sm:flex-row, wraps logo and thumbnail action clusters, stacks the checkbox groups, constrains badge markdown with internaloverflow-x-auto, wraps generated-content preview panes in local horizontal scroll containers, and makes regenerate or save action rows wrap cleanly.GeneratedContentSectionandSeoContentSectionnow use mobile-safe header and action layouts, and thereact-markdowncomponent override typing was normalized withComponentsplusComponentPropsWithoutRefso the edited file ends lint-clean.AiReviewResultsPanelnow gives the left header clustermin-w-0 flex-1, moves title plus date into a stackable sub-column, keeps the copy and chevron controls shrink-safe on the right, and addsmin-w-0 overflow-hiddenplusbreak-wordsto the expanded summary and error blocks.PackageMetadataEditoralso now wraps its footer action row and adds an overflow guard on the expanded container. - Files:
src/pages/Admin.tsx,src/components/ComponentDetailsEditor.tsx,prds/admin-mobile-expanded-editors.md,TASK.md,changelog.md,files.md - Verification:
ReadLintsclean onsrc/pages/Admin.tsxandsrc/components/ComponentDetailsEditor.tsx.
- PRD:
-
Mobile: fix orphaned Hide button in expanded Component Author / Details / Metadata sections (2026-04-17 17:35 UTC)
- Root cause: the previous fix stacked the header onto two rows on mobile (
flex-col), which worked fine when collapsed but looked broken when expanded — the pill button ("Hide") was left floating between the description text and the expanded content, creating dead vertical space between the section description and the first field. - Fix: reverted the three disclosure headers (
AuthorToggleSection,PackageComponentDetailsEditor,PackageMetadataEditor) back to a single-rowflex items-start justify-between gap-2 sm:gap-3layout. Text wrapper getsmin-w-0 flex-1so the title + description use all available width; pill button keepsshrink-0 whitespace-nowrapso it never truncates. To keep the collapsed row from wrapping on narrow screens, mobile-only shortened labels were added: "Show author" → "Show", "Edit details" → "Edit", "Edit metadata" → "Edit" (viasm:hidden/hidden sm:inlinespan swap). Open state keeps the compact "Hide" label for all three. Now on mobile, both states render as:[title + desc on left | compact pill on right]above[expanded content]. - Files:
src/pages/Admin.tsx,changelog.md,TASK.md - Verification:
ReadLintsclean.
- Root cause: the previous fix stacked the header onto two rows on mobile (
-
Mobile admin card polish: component name, section headers, action labels (2026-04-17 17:20 UTC)
- Root cause 1 (component name hidden): the collapsible package header row in
AdminDashboard(src/pages/Admin.tsx~line 9094) rendered<span className="font-medium ... truncate">{pkg.name}</span>withoutflex-1 min-w-0. Siblings (version pill, StatusBadge, VisibilityBadge, PaymentBadge, ComponentDetailQuickLink, date) all hadshrink-0, so on a 375px viewport the truncated name collapsed to 0px width and disappeared completely. Users only saw version + badges + date with no package identity. - Fix 1: added
min-w-0 flex-1to the name span and switched topkg.componentName || pkg.nameso the friendly component name shows when set. WrappedPaymentBadgeandComponentDetailQuickLinkin<span className="hidden sm:inline-flex">so they only appear on desktop, freeing horizontal space on mobile for the name. - Root cause 2 (cramped section headers): Component Author, Component Details, and Package Metadata disclosures (
AuthorToggleSection,PackageComponentDetailsEditor,PackageMetadataEditor) usedflex items-center justify-between gap-2 sm:gap-3with the pill button sharing the row. On mobile the button took ~80px on the right, forcing "PACKAGE METADATA" to wrap to two lines and descriptions to three lines. Looked unfinished. - Fix 2: switched all three disclosure headers to
flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 sm:gap-3so on mobile the title + description get full width on top and the pill drops to its own row withself-start sm:self-auto. Addedmin-w-0to the text wrapper for safety. Desktop layout unchanged. - Root cause 3 (icon-only action buttons): every action button in the Actions, Status, Review, and Visibility rows of
InlineActionsused<span className="hidden sm:inline">{label}</span>, leaving admins with unlabeled circle icons on mobile. No way to tell Hide from Feature from Reward without opening a tooltip. - Fix 3: removed
hidden sm:inlinefrom 18 label spans insideInlineActions(Convex Verified, Community, Generate Content, Update README, Hide SEO, Auto-fill, Hide Thumb, Refresh, Slug, Reward, History, Status{btn.label}, Security Scan, Review history, Unarchive, Visibility{btn.label}, Feature, Sub Hide, Delete) plusAiReviewButton,NotesButton("Notes"), andCommentsButton("Messages") which all render inside the Visibility row. Buttons now show icon + text on mobile, wrap naturally via the existingflex-wrapcontainers, and give admins readable mobile usability. Badges inside the collapsed card header (StatusBadge, VisibilityBadge, PaymentBadge) still use icon-only mobile mode since they sit in the compact summary row. - Files:
src/pages/Admin.tsx,changelog.md,TASK.md - Verification:
ReadLintsclean onsrc/pages/Admin.tsx.
- Root cause 1 (component name hidden): the collapsible package header row in
-
Mobile overflow fix for User Messages and Admin Notes comment cards (2026-04-17 10:30 UTC)
- Root cause: in
AdminPackageCommentsPanel(src/pages/Admin.tsx) every comment card usedflex items-start justify-between gap-2with a single-row meta group (user icon + name + date + optional New badge) and an action group (Hide + Archive + Delete). On narrow screens the meta row had no wrap and nowhitespace-nowrapon the date, so "Apr 16, 11:36 PM" broke across four lines, and the action cluster pushed the red Delete pill off the right edge of the modal. - Fix: switched the header row to
flex flex-col sm:flex-row sm:items-start sm:justify-between gap-2so actions stack below the meta on mobile. Meta group nowflex flex-wrap items-center gap-x-2 gap-y-1withwhitespace-nowrapon the name, date, and New badge so they stay intact but wrap to the next line as needed. Action group nowflex flex-wrap items-center gap-1 shrink-0withwhitespace-nowrap shrink-0on every pill so Hide/Archive/Delete never get clipped. Comment body getsbreak-wordsso long unbroken strings (URLs, lorem ipsum) don't push the card sideways. Same whitespace-nowrap + break-words polish applied toAdminPackageNotesPanelnotes and replies for consistency. - Files:
src/pages/Admin.tsx,changelog.md,TASK.md - Verification:
ReadLintsclean.
- Root cause: in
-
Fix duplicate mobile search and make mobile search box white (2026-04-17 10:22 UTC)
- Root cause:
src/pages/Admin.tsxhad two wired-up search inputs — a sticky "Admin Dashboard" header search (line ~2811) that was always visible, plus asm:hiddenmobile search insideAdminDashboard(line ~8904). The header search was never hidden on mobile, so both rendered and the header one got its placeholder clipped to "Search packa" next to the "Admin Dashboard" label. - Fix: added
hidden sm:blockto the header search input wrapper so only the "Admin Dashboard" label shows on mobile. The mobile-only search insideAdminDashboardnow switches frombg-bg-card(cream) tobg-whiteand fromrounded-lgtorounded-fullso it reads as white and matches the rest of the site's pill design system. - Files:
src/pages/Admin.tsx,changelog.md,TASK.md - Verification:
ReadLintsclean.
- Root cause:
-
Mobile fix for stats + links row in expanded admin package card (2026-04-17 10:15 UTC)
src/pages/Admin.tsx"Stats and links" row (downloads, date, npm/repo/demo buttons): on narrow screens the date span was wrapping onto three lines because the single flex row had to share width with the three pill buttons. Changed the parent fromflex items-center gap-4 shrink-0 w-full sm:w-autotoflex flex-col sm:flex-row items-stretch sm:items-center gap-2 sm:gap-4 ...so on mobile the stats sit on one row above the link pills, and addedwhitespace-nowrapto the downloads and date spans so "Mar 26, 2026" stays on a single line. Desktop layout is unchanged. The links container also dropsml-autoon mobile (it was just pushing buttons across the row) and keepssm:ml-0+flex-wrapas a safety net.- Files:
src/pages/Admin.tsx,changelog.md,TASK.md - Verification:
ReadLintsclean.
-
Mobile polish for bell dropdown, admin editors, and message panel headers (2026-04-17 10:05 UTC)
src/components/Header.tsxrenderBellDropdown: dropdown now usesfixed + left-1/2 -translate-x-1/2on mobile so it centers below the header instead of getting clipped on the left edge; desktop keeps the previousabsolute right-0 top-fullbehavior viasm:overrides. Width iscalc(100vw - 1rem)withmax-w-smon mobile so it sits comfortably inside the viewport.src/pages/Admin.tsxComponent Details, Component Author, and Package Metadata disclosures: the right-side pill buttons ("Edit details", "Show author", "Edit metadata") now usepx-2 py-1 text-[11px]on mobile andsm:px-3 sm:py-1.5 sm:text-xson desktop, withwhitespace-nowrap+shrink-0to prevent wrapping. Labels collapse to "Hide" when open so the open state is compact on narrow screens. Parent row gap drops fromgap-3togap-2 sm:gap-3so the description text gets more breathing room.src/pages/Admin.tsxAdminPackageCommentsPanelandAdminPackageNotesPanelmodal headers: switched toflex-col sm:flex-rowso the title + meta stack above the action row on mobile. The closeXnow lives next to the title on mobile and stays on the right on desktop. The toggle label "Show hidden or archived" shortens to "Show archived" on mobile, and the "Mark all read" pill getswhitespace-nowrap+shrink-0so it no longer wraps to two lines.- Files:
src/components/Header.tsx,src/pages/Admin.tsx,changelog.md,TASK.md - Verification:
ReadLintsclean on both files.
-
Clean up convex-doctor findings to reach 100/100 (2026-04-17 09:45 UTC)
- Errors fixed in
convex/apiKeys.tscountKeysAndGrants: the twoperf/unbounded-collecterrors on theapiKeysactive-count andapiAccessGrantscollect became bounded.take(10000)calls, and theperf/collect-then-filterwarning disappeared because the grants query now uses the existingby_revokedindex with.eq("revoked", false)instead of filtering in JavaScript. arch/no-convex-errorresolved inconvex/securityScan.tsrunSecurityScanby switching the auth guard fromthrow new Error(...)tothrow new ConvexError(...), addingConvexErrorto the existingconvex/valuesimport. This keeps the auth message visible in production instead of getting redacted to "Server Error".- Refactored five
arch/large-handlerwarnings down to 0 by extracting helpers while preserving behavior:computeDashboardStats+emptyDashboardStatsinconvex/dashboard.ts;scheduleSubmissionFollowups,formatLatestSecurityScan, andcomputeUnreadAdminReplySummaryinconvex/packages.ts; andbuildProviderTasks/runProviderTasks/buildProviderResultsForStorage/saveScanError/executeScanAndSaveResultinconvex/securityScan.ts. All three error branches of_runSecurityScannow share the same writer, so stored error payloads are guaranteed identical. - Files:
convex/apiKeys.ts,convex/dashboard.ts,convex/packages.ts,convex/securityScan.ts,changelog.md,files.md,task.md - Verification:
npx convex-doctor→ 100/100 with "No issues found across 23 files in 235ms".npm run build(Netlify build) passes in ~4.2s with no new errors.ReadLintsclean on every edited file.npx convex devis still picking up pushes without schema validation errors.
- Errors fixed in
-
Polish Mark read button layout in Admin + Profile message panels (2026-04-17 09:10 UTC)
AdminPackageCommentsPanelinsrc/pages/Admin.tsx: moved the per-comment Mark read pill out of the top-right action cluster (which was wrapping when combined with Hide/Archive/Delete + the New badge) and onto its own row below the message content. Icon removed — the pill is just the word "Mark read" now.ViewNotesModalinsrc/pages/Profile.tsx: merged the Mark read pill into the same action row as Hide/Archive/Delete (after Delete when both apply), so admin replies the current user can also manage only show one action row.Checkicon removed.- Dropped the unused
Checkimport fromsrc/pages/Admin.tsx. - Files:
src/pages/Admin.tsx,src/pages/Profile.tsx,changelog.md - Verification:
ReadLintsclean on both files; HMR picked up the updates.
-
Fix admin-side Mark read pill + bell-dropdown pagination scroll (2026-04-17 08:55 UTC)
- Root cause 1 (Mark read pill):
AdminPackageCommentsPanelinsrc/pages/Admin.tsxgated the pill oncomment.authorEmail !== userEmail. When an admin uses their own/profileto test, the submitter email equals the admin email, so every message was treated as the admin's own (Hide/Archive/Delete only) and the Mark read pill never rendered, even though the bell dropdown correctly flagged those same messages as unread. - Fix 1: dropped the author-email check. The gate is now simply
comment.adminHasRead !== true. Admin replies written from the admin panel already haveadminHasRead: true, so they still never show the pill. - Root cause 2 (bell scroll): the scroll effect only depended on
hashTargetPackageId. When the target package lived on page 2+ or under a different filter, the first pass fired withhashTargetRef.current = null, the pagination-jump effect then mutatedcurrentPage[activeFilter], but the scroll effect did not re-run so the now-mounted row never scrolled into view. After 2 seconds the highlight also cleared, racing the jump. - Fix 2: split the scroll into its own effect that also depends on
activeFilterandcurrentPage, and extended the highlight fade-out from 2s to 4s so filter/page switches have time to render first. - Files:
src/pages/Admin.tsx,changelog.md - Verification:
ReadLintsclean onsrc/pages/Admin.tsx;npm run devHMR picked up the patch without errors.
- Root cause 1 (Mark read pill):
-
Remove auto-mark-all-read-on-open so per-message Mark read button is actually visible (2026-04-17 08:35 UTC)
- Root cause:
AdminPackageCommentsPanel,AdminPackageNotesPanel(both insrc/pages/Admin.tsx), andViewNotesModal(insrc/pages/Profile.tsx) each had auseEffectthat called the bulkmarkCommentsAsReadForAdmin/markNotesAsReadForAdmin/markPackageNotesAsReadmutation as soon as the panel opened with any unread items. This flippedadminHasRead/userHasReadtotrueon every comment or note before the render could show the new per-message "Mark read" pill, so the admin and the submitter both saw zero buttons. - Fix: deleted the three auto-mark effects. The bulk "Mark all read" pill in each panel header still calls the same bulk mutations, and the per-message "Mark read" pills already call
markPackageCommentReadForAdmin/markPackageCommentReadForUser. Marking messages read is now fully opt-in; the bell badge stays until the user or admin acts. - Files:
src/pages/Admin.tsx,src/pages/Profile.tsx,changelog.md - Verification:
ReadLintsclean on both files.
- Root cause:
-
Per-message Mark read buttons, universal ESC close, and pagination-aware hash navigation (2026-04-17 08:15 UTC)
- PRD:
prds/admin-profile-messages-ux.md - Backend: added
markPackageCommentReadForAdmin({ commentId })(admin-only) andmarkPackageCommentReadForUser({ commentId })(owner-only viauserOwnsPackage) inconvex/packages.ts; both are idempotent early-returns when already read or the comment is missing. - Admin UI:
AdminPackageCommentsPanelinsrc/pages/Admin.tsxnow shows a per-comment "Mark read" pill and "New" badge on submitter messages whereadminHasRead !== true. The existing bulk "Mark all read" pill is untouched. - User UI:
ViewNotesModalinsrc/pages/Profile.tsxnow shows a per-note "Mark read" pill on admin replies whereuserHasRead === false. - ESC close: added keyboard handlers to
ConfirmModal, reward confirm, reward history, and test reward confirm modals insrc/pages/Admin.tsx; added handlers toRequestModal,ViewNotesModal,EditModal, andApiUsageModalinsrc/pages/Profile.tsx. In-flight sends/submits guard ESC on the reward and form modals. - Pagination jump: extended the
#pkg-<id>hash effect inAdminDashboard(src/pages/Admin.tsx) to switchactiveFilter(toall,archived, ormarked_for_deletion) and updatecurrentPage[activeFilter]when the target package is on a different page or excluded by the current filter, so the scroll + highlight effect always lands on the right row. - Files:
convex/packages.ts,src/pages/Admin.tsx,src/pages/Profile.tsx,files.md,changelog.md,prds/admin-profile-messages-ux.md - Verification:
ReadLintsclean on all three edited source files;npx tsc --noEmit -p tsconfig.app.jsonreports only pre-existing errors inCodeBlock.tsx,ComponentDetailsEditor.tsx,CategoryPage.tsx,Directory.tsx(unrelated).
- PRD:
-
Remove leftover agent debug telemetry from thumbnail flow (2026-04-16 22:55 UTC)
- Root cause: a prior debug session (
sessionId:"10e84f", runId"pre-fix") left eightfetch("http://127.0.0.1:7557/ingest/496d4f8a-92e4-4a9c-a7be-0c1a3758fbbe", ...)calls bracketed by// #region agent log/// #endregionmarkers. The client-side copies were loggingnet::ERR_CONNECTION_REFUSEDin DevTools on every editor mount and every Generate Thumbnail click, while the Convex copies were silently failing from the Node runtime on every admin thumbnail run. - Fix: deleted 4 blocks in
convex/thumbnailGenerator.ts(inside_generateThumbnailForPackage) and 4 blocks insrc/components/ComponentDetailsEditor.tsx(in the thumbnail syncuseEffectandhandleGenerateThumbnail). All calls were fire-and-forget with.catch(()=>{}), so removal changed no logic. - Files:
convex/thumbnailGenerator.ts,src/components/ComponentDetailsEditor.tsx - Verification:
rg "127.0.0.1:7557"→ 0 matches,rg "#region agent log"→ 0 matches,rg "10e84f"→ 0 matches,npm run buildpasses in ~4.4s with no new errors. Pre-existing TypeScript diagnostics in both files (Buffer/Blob type mismatch, ReactMarkdownComponentsJSX namespace) are unrelated and left alone.
- Root cause: a prior debug session (
-
Make mobile search bar white on Directory and category pages (2026-04-17 05:21 UTC)
- Added
inputClassName="bg-white border border-border"to the mobileSearchBaronsrc/pages/Directory.tsxso it matches the desktop sidebar search instead of inheriting the creambg-bg-primarydefault. - Applied the same change to the mobile
SearchBaronsrc/pages/CategoryPage.tsxso category views behave the same way. - Reviewed mobile category pills; the existing
overflow-x-autohorizontal scroll is the right pattern for the number of categories and was left unchanged. - Files:
src/pages/Directory.tsx,src/pages/CategoryPage.tsx - Verification:
npm run buildpasses.
- Added
-
Add preflight check usage warning modal on SubmitCheck page (2026-04-16 22:30 UTC)
- Added
PreflightWarningModalcomponent insrc/pages/SubmitCheck.tsxthat confirms the 10 checks per hour per IP limit and 30-minute per-repo cache before the check runs. - Reused the existing
GenerateWarningModaldesign language (amberWarningicon, Continue/Cancel buttons, ESC close, backdrop click close when idle). - Split
handleSubmitintohandleOpenWarning(validates and opens modal) andrunPreflightCheck(fetches after confirmation); modal closes automatically in the requestfinallyblock. - Updated
files.mdSubmitCheck description to mention the new pre-check warning modal. - Verification:
ReadLintsclean onsrc/pages/SubmitCheck.tsx;npm run buildpasses.
- Added
-
Fix Directory sidebar category counts staying 0 after admin category edits (2026-04-16 21:45 UTC)
- Root cause:
updateComponentDetailsinconvex/packages.tspatchedcategory/convexVerifiedwithout callingrecountCategoryStats(ctx), so the denormalizedpackageCount/verifiedCounton thecategoriestable stayed stale. listCategories(sidebar) reads those denormalized counters directly;getCategoryBySlug(category page) computes live, which is why the two disagreed.- Fix: call
recountCategoryStats(ctx)at the end ofupdateComponentDetailswhenever the patch touchescategoryorconvexVerified. - File:
convex/packages.ts - Verification:
ReadLintsclean onconvex/packages.ts; sidebar now matches the category page after an admin category change.
- Root cause:
-
Refresh denormalized category counts on slug rename and category delete (2026-04-16 21:55 UTC)
updateExistingCategorynow callsrecountCategoryStats(ctx)after reassigning packages to the new slug.deleteCategorynow callsrecountCategoryStats(ctx)after clearingcategoryon related packages.- Tightened
updateExistingCategoryctx type fromanytoMutationCtxfor type safety. - File:
convex/packages.ts - Verification:
ReadLintsclean onconvex/packages.ts.
-
Fix package submission and dashboard download validator drift (2026-04-15 17:52 UTC)
- PRD:
prds/package-download-validator-fix.md - Added
allTimeDownloadsto the missing submit and npm update validators inconvex/packages.ts, plus the existing-package patch and new-package insert paths. - Verified the current
convex/dashboard.tsquery still returnstotalAllTimeDownloads. - Verification:
npm run build,ReadLints, live Convex reload in the runningnpx convex devsession
- PRD:
-
Fix directory download sync after npm refreshes (2026-04-15 02:11 UTC)
- PRD:
prds/dashboard-refresh-and-directory-download-sync.md - Added focus, visibility, and page-show refetch hooks in
src/pages/Directory.tsxso one-shot directory data picks up refreshed npm counts without restoring full live subscriptions. - Verification:
npm run build
- PRD:
-
Add dashboard package refresh controls (2026-04-15 02:11 UTC)
- PRD:
prds/dashboard-refresh-and-directory-download-sync.md - Added a per-package refresh icon beside weekly downloads and a bulk
Refresh allcontrol beside CSV insrc/pages/Dashboard.tsx, both reusing the existing safe admin refresh actions. - Verification:
npm run build
- PRD:
-
Component pages: HTTP one-shot load so Googlebot can render content (2026-06-09 10:38 UTC)
- Problem:
convex.dev/components/*stuck at "Discovered - currently not indexed". GSC Live Test showed an empty render; console showed the Convex websocket stuckconnectingwithModifyQuerySetmessages never sent, so content never loads for Googlebot. - Fix: load initial component data over HTTP via
ConvexHttpClient(same/api/querythe edge function uses), keep the liveuseQueryfor reactivity. Frontend-only, no Convex deploy. - PRD:
prds/component-http-fallback.md - Files:
src/lib/convexHttp.ts(new),src/pages/ComponentDetail.tsx - Validation: GSC URL Inspection Live Test (rendered HTML + screenshot populated), Request Indexing, confirm live features still work.
- Problem:
-
Mirror all comment/note writes to Slack (2026-04-18)
addPackageComment: removedif (!isAdmin)gate, Slack now fires for both admin and submitter with role-basedFrom:labelrequestSubmissionRefresh: added Slack notification afterpackageCommentsinsert (From: Submitter)addPackageNote: added Slack notification with branching first line for internal notes vs legacy[User Request]admin replies- File changed:
convex/packages.ts
-
Add admin message notifications bell with dropdown and mark-all-read buttons (2026-04-17 06:17 UTC)
- Added two new Convex public queries in
convex/packages.ts:getMyUnreadAdminRepliesByPackage(user feed) andgetAdminUnreadMessagesByPackage(admin-only feed, capped at 50 packages). Both return minimal metadata (packageId,packageName,slug,unreadCount,lastMessageAt) and reuse the existingby_submitter_email/by_package_and_createdindex patterns fromgetTotalUnreadAdminReplies. No schema changes. - Added Phosphor
Bell(color#E05C35) insrc/components/Header.tsximmediately right of the Submit link and in the mobile header row. Only rendered for authenticated users. Clicking opens a dropdown card with two sections: "Messages from Convex Team" and, for admins only, "Incoming messages". Total unread count appears as a round pill badge. Outside-click closes the dropdown. - Item clicks navigate to
/components/profile#pkg-<id>(user) or/components/submissions/admin#pkg-<id>(admin). src/pages/Profile.tsx: addedid="pkg-<packageId>"to eachSubmissionCard, plus a hash-drivenscrollIntoView+ two-second ring-highlight effect. Upgraded the existing "Mark all read" text link inViewNotesModalto a visible pill button.src/pages/Admin.tsx: addedid="pkg-<packageId>"to each package row and a hash-driven effect that auto-adds the targeted id toexpandedPackages, scrolls it into view, and applies a two-second#E05C35ring highlight. Upgraded the "Mark all read" link inAdminPackageCommentsPanelto a pill button. WiredAdminPackageNotesPanelwithgetUnreadUserNotesCount+markNotesAsReadForAdminso it now shows an unread badge, auto-marks on open, and exposes a visible "Mark all read" pill button.- Files:
convex/packages.ts,src/components/Header.tsx,src/pages/Profile.tsx,src/pages/Admin.tsx,prds/admin-message-notifications-bell.md - Verification:
npx tsc --noEmit -p convex/tsconfig.jsonpasses;npx tsc --noEmit -p tsconfig.app.jsonreports no new errors in the edited files (only pre-existing CodeBlock / ComponentDetailsEditor / CategoryPage / Directory issues remain).
- Added two new Convex public queries in
-
Add spacing above Keywords section on ComponentDetail when code is present (2026-04-14 13:35 UTC)
- Added
mt-8to the Keywords container div so it has visual separation from code blocks or markdown content above - File:
src/pages/ComponentDetail.tsx
- Added
-
Fix crons component page crash on production (2026-04-14 13:15 UTC)
- Added
PageErrorBoundaryinsrc/main.tsxwrappingComponentDetailroute to catch useQuery and rendering errors - Added
MarkdownErrorBoundaryinsrc/pages/ComponentDetail.tsxaround allReactMarkdownsections - Refactored
CodeBlock.tsxto render plain text code blocks as simple<pre>instead of PierreFile highlighter (prevents hangs on Unicode box-drawing ASCII art) - Removed localhost-only debug instrumentation from previous session
- Files:
src/main.tsx,src/pages/ComponentDetail.tsx,src/components/CodeBlock.tsx
- Added
-
Dashboard improvements: remove Pre-Oct 2025 card, add all-time downloads, add CSV/PDF export (2026-04-14 00:30 UTC)
- Removed Pre-Oct 2025 stat card from
convex/dashboard.tsandsrc/pages/Dashboard.tsx - Added
allTimeDownloadsoptional field to packages schema, fetched from npm API during refresh - Added "All Time Downloads" stat card alongside existing "Weekly Downloads" card
- Added CSV and PDF export buttons to the Components table header, exports the current filtered view
- Updated
fetchNpmPackageHandlerto fetch cumulative downloads from npm date-range API - Updated
_updateNpmDataAndTimestamp,adminPackageValidator,toAdminPackageto includeallTimeDownloads - Files:
convex/schema.ts,convex/dashboard.ts,convex/packages.ts,src/pages/Dashboard.tsx
- Removed Pre-Oct 2025 stat card from
-
Fix security report modal stacking with createPortal (2026-04-13)
- Wrapped
SecurityReportModalandSubmitSecurityReportModalincreatePortal(..., document.body) - Sticky sidebar created a local stacking context causing main content to overlap the modal
- Added
import { createPortal } from "react-dom"to both files - Ref: PR #22
- Files:
src/pages/ComponentDetail.tsx,src/pages/Submit.tsx
- Wrapped
-
Rename Security Analyze to Community scan via Socket and add takedown FAQ (2026-04-13 23:30 UTC)
- Removed shield icon and scan date from public security modals in
ComponentDetail.tsxandSubmit.tsx - Changed modal title to "Community scan via Socket" (attributed to Socket, not Convex)
- Added takedown, removal, and review flow FAQ items to
FAQSection.tsxwith contact Convex - Updated
submit.md,component-detail.md,admin-security-scan.md,index.mddocumentation - Removed FAQ from Submit.tsx AboutModal (was added by mistake)
- Files:
src/pages/ComponentDetail.tsx,src/pages/Submit.tsx,src/components/FAQSection.tsx,src/docs/submit.md,src/docs/component-detail.md,src/docs/admin-security-scan.md,src/docs/index.md
- Removed shield icon and scan date from public security modals in
-
Add community approved/rejected stats and review status filter to dashboard (2026-04-13 22:15 UTC)
- Added "Community Approved" and "Community Rejected" stat cards to Dashboard
- Added "Status" dropdown filter (All / Approved / Not approved / Pending / In review / Changes requested / Rejected)
- Status filter integrates with existing type, date, and author filters and clears with the Clear button
- Updated
component-report.htmlwith community approval/rejection counts, status badges, and a filter/sort dropdown - Files:
src/pages/Dashboard.tsx,component-report.html
-
Add admin analytics dashboard (2026-04-13 21:00 UTC)
- Created
convex/dashboard.tswithgetDashboardStatsadmin-gated query (aggregated counts, download sums, per-author breakdown, monthly timeline) - Created
src/pages/Dashboard.tsxwith stat cards, filterable components table, author summary, monthly timeline, filters/sorting, refresh - Added
/dashboardroute insrc/main.tsx - Added Dashboard nav link (with ChartBar icon) in
src/components/Header.tsxfor admin users (desktop + mobile) - UI matches app design system:
bg-bg-primarybackground, white cards/tables - Refresh button wired to
triggerManualRefreshAllaction to pull live npm data - Custom date range picker (From/To date inputs) alongside preset date filters
- Author filter changed to multi-select exclusion checklist (hide/show individual authors, bulk show all / hide all)
- Removed investor references from dashboard copy
- Info banner about live data and post-deploy refresh
- Files:
convex/dashboard.ts(new),src/pages/Dashboard.tsx(new),src/main.tsx,src/components/Header.tsx,files.md,changelog.md
- Created
-
Remove status labels from public Security Analyze modals (2026-04-04 00:30 UTC)
- Removed "Status: Safe as of..." / "Alerts" / "Not scanned" line from both public modals
- Now shows only "Not yet scanned" or "Scanned [date]" with no safe/warning/unsafe wording
- Admin reports unchanged
- Files changed:
src/pages/ComponentDetail.tsx,src/pages/Submit.tsx
-
Fix infinite re-render loop on Admin API tab (2026-04-03 14:10 UTC)
- Root cause:
Date.now()called directly in render body caused ConvexuseQueryto re-subscribe on every render - Stabilized
nowarg withuseMemorounded to nearest minute - Fixed
countKeysAndGrantsto useby_statusindex instead of.take(1000)+ JS.filter() - Files changed:
src/pages/Admin.tsx,convex/apiKeys.ts
- Root cause:
-
Slack notification on new component submission (2026-04-02 12:00 UTC)
internal.slack.sendMessageinconvex/slack.ts;submitPackageschedules after_addPackage; envSLACK_WEBHOOK_URL- Files:
convex/slack.ts,convex/packages.ts,convex/_generated/api.d.ts,prds/slack-submission-notifications.md,changelog.md,files.md
-
Fix listAllDirectoryCategories return validator missing optional fields (2026-04-02 08:00 UTC)
- Production crash: categories with
packageCount/verifiedCountfields failed the strict return validator - Added
packageCount: v.optional(v.number())andverifiedCount: v.optional(v.number())to match schema - File changed:
convex/packages.ts
- Production crash: categories with
-
Add security scanning documentation to src/docs (2026-04-02 07:30 UTC)
- Created
src/docs/admin-security-scan.mdwith full coverage of providers, scanning modes, settings, results, public visibility, env vars, data model, and troubleshooting - Registered in
src/pages/Documentation.tsxwith import and docs array entry - Updated
src/docs/index.md,admin-settings.md,admin-dashboard.md,admin-review.md,component-detail.md, andsubmit.mdwith security scan references - Files changed:
src/docs/admin-security-scan.md(new),src/pages/Documentation.tsx,src/docs/index.md,src/docs/admin-settings.md,src/docs/admin-dashboard.md,src/docs/admin-review.md,src/docs/component-detail.md,src/docs/submit.md
- Created
-
Move "How to get help" above Security Analyze in ComponentDetail.tsx sidebar (2026-04-02 06:00 UTC)
- Swapped sidebar order so "How to get help" renders before the security scan box
- Removed scan date subtitle from all SecurityScanBox states (not_scanned, scanning, scanned)
- Simplified to a single-line clickable "Security Analyze" label
- Files changed:
src/pages/ComponentDetail.tsx
-
Add configurable batch size to security scan backlog (2026-04-02 05:45 UTC)
- Replaced hardcoded batch size of 20 with a dropdown selector (5, 10, 20, 50, 100)
- Files changed:
src/pages/Admin.tsx
-
Fix duplicate ExternalLinkIcon declaration in Submit.tsx (2026-04-02 05:30 UTC)
- Removed duplicate
ExternalLinkIconimport from@radix-ui/react-icons, used existingRadixExternalLinkIconalias - Files changed:
src/pages/Submit.tsx
- Removed duplicate
-
Fix TypeScript error in runSecurityScanBacklog filter (2026-04-02 05:25 UTC)
- Removed redundant
!== "scanning"check that TS flagged as unreachable after prior conditions - Files changed:
convex/packages.ts
- Removed redundant
-
Add Security Analyze button and modal on Submit.tsx next to Demo (2026-04-02 05:15 UTC)
- Added
Shieldicon import andSubmitSecurityReportModal+SecurityAnalyzeButtoncomponents to Submit.tsx - Button appears in expanded action row for every package, loads scan data via
getLatestSecurityScan - Modal matches ComponentDetail.tsx style: providers, recommendations, contact author, third party notice
- Files changed:
src/pages/Submit.tsx
- Added
-
Add security scan backlog queue and tracker in Admin settings (2026-04-02 05:15 UTC)
- Added
getSecurityScanBacklogStatsquery toconvex/packages.tswith badge-style counts - Added
runSecurityScanBacklogmutation that queues unscanned/errored packages - Added backlog section to
SecurityScanSettingsPanelin Admin.tsx with configurable batch size and progress badges - Files changed:
convex/packages.ts,src/pages/Admin.tsx
- Added
-
Remove Devin AI integration from security scan UI and orchestrator (2026-04-02 04:15 UTC)
- Removed Devin toggle from Admin.tsx settings, provider badge from review history, and tooltip text
- Removed Devin provider names/URLs from ComponentDetail.tsx security report modal
- Removed Devin task from securityScan.ts orchestrator and result saving
- Hardcoded
enableDevinScan: falsein packages.ts, removed from scheduled scan provider check - Schema fields kept for backward compat with existing scan runs
- Socket.dev and Snyk unaffected, typecheck and lint clean
-
Fix Devin v3 session request shape after
session_linksvalidation error (2026-04-02 01:30 UTC)- Confirmed Convex now uses a v3 style
cog_Devin key instead of the legacyapk_key family - Root cause:
convex/securityScan.tswas sendingadvanced_mode: "analyze"on session creation, but Devin requiressession_linksfor analyze mode and returns422 - Removed the invalid
advanced_modefield, typechecked withnpx tsc --noEmit, and verified direct v3 session creation now gets past validation - Current external blocker is Devin org billing:
403 {"detail":"Your organization has a billing error. Error: renew_subscription"} - Files changed:
convex/securityScan.ts
- Confirmed Convex now uses a v3 style
-
Fix Devin security scan auth messaging and public security modal behavior (2026-04-02 01:13 UTC)
- Confirmed direct Devin v3 session creation returns
403 Unauthorizedwith current Convex env vars onconvex-elevenlabs - Current
DEVIN_API_KEYin Convex uses the legacyapk_key family, soconvex/securityScan.tsnow returns a clear action message for legacy Devin keys and preserves provider error text in stored scan summaries - Updated
src/pages/ComponentDetail.tsxto lock document scroll while the security modal is open, raise the modal stacking order, and hide the findings list from the public modal - Re-ran the
convex-elevenlabsscan, verified Devin still showserroruntil the key is replaced, and verifiednpx tsc --noEmitplusReadLints - PRD:
prds/security-scan-devin-modal-followup.md
- Confirmed direct Devin v3 session creation returns
-
Fix Socket.dev security scan endpoint and response parsing (2026-04-01 22:05 UTC)
- Root cause:
convex/securityScan.tswas callinghttps://api.socket.dev/v0/report/supported, which returns404 API route not found - Switched Socket lookup to
https://api.socket.dev/v0/purl?alerts=true&compact=true - Updated parsing to handle Socket's
application/x-ndjsonresponse and treat empty successful responses as no alerts instead of a scan failure - Verified by rerunning the
@convex-dev/stripescan and confirmingsocketnow storessafein Convex - Files changed:
convex/securityScan.ts
- Root cause:
-
Fix search scroll and navigation scroll-to-top bugs (2026-03-28 20:00 UTC)
- Added
window.scrollTo({ top: 0, behavior: "smooth" })in Directory.tsx and CategoryPage.tsx when search term changes - Set
history.scrollRestoration = "manual"andwindow.scrollTo(0, 0)in main.tsx to prevent browser restoring old scroll positions on full-page navigation - Files changed:
src/main.tsx,src/pages/Directory.tsx,src/pages/CategoryPage.tsx
- Added
Session updates complete on 2026-03-27 01:00 UTC.
-
Remove 20k character cap on stored README content (2026-03-27 01:00 UTC)
- Removed
.slice(0, 20000)from both save paths inconvex/seoContent.ts - Full README now stored without any character limit
- Files changed:
convex/seoContent.ts
- Removed
-
Fix README not showing on components without AI content (2026-03-27 00:45 UTC)
- Moved
readmeIncludedMarkdownrendering outside v2 content gate insrc/pages/ComponentDetail.tsx - README now displays independently of
contentModelVersion === 2 && generatedDescription - Files changed:
src/pages/ComponentDetail.tsx
- Moved
-
Add admin Update README action button (2026-03-27 00:15 UTC)
- Added
refreshReadmeinternal action andrefreshReadmeContentpublic action inconvex/seoContent.ts - Added
_updateReadmeOnlyinternal mutation inconvex/seoContentDb.ts - Added Update README button in admin Actions row next to Generate Content in
src/pages/Admin.tsx - Fetches and stores latest README from GitHub without regenerating AI content
- Files changed:
convex/seoContent.ts,convex/seoContentDb.ts,src/pages/Admin.tsx
- Added
-
Fix README truncation on component detail pages (2026-03-26 22:00 UTC)
- Split
sanitizeReadmeForPromptintosanitizeReadme(no truncation) andsanitizeReadmeForPrompt(12k truncation for AI prompts only) inconvex/seoContent.ts - Added
fullContentfield toGitHubReadmeResulttype sofetchGitHubReadmereturns both truncated and full sanitized README - Updated
fetchContentContextandfetchPreviewContextto usefullContentforreadmeIncludedMarkdownextraction - AI prompts still receive truncated content; stored and displayed README is now the full version
- Existing packages need content regeneration to populate full README
- Files changed:
convex/seoContent.ts
- Split
-
Scale optimization: bandwidth and subscription reduction (2026-03-21 00:30 UTC)
- PRD at
prds/scale-optimization.md - Added compound indexes:
by_reviewStatus_and_visibility_and_markedForDeletion,by_featured_and_reviewStatus,by_enabled_and_sortOrder,by_status(apiKeys),by_revoked(apiAccessGrants) - Swapped Directory.tsx and CategoryPage.tsx from reactive
useQueryto one-shotconvex.query()fetches - Added change detection in
updateNpmDataHelperto skip no-op patches - Denormalized category counts into
categoriestable (packageCount,verifiedCountfields) listCategoriesnow reads only the categories table (no package scan)- REST API
/api/components/searchnow uses Convex search indexes instead of loading all packages - Added
_searchApprovedPackagesinternal query andbackfillCategoryCountsinternal mutation - Source: https://stack.convex.dev/optimizing-openclaw
- Files changed:
convex/schema.ts,convex/packages.ts,convex/http.ts,src/pages/Directory.tsx,src/pages/CategoryPage.tsx
- PRD at
-
Debug and fix admin thumbnail generation from
ComponentDetailsEditor.tsx(2026-03-19 01:05 UTC)- Investigate the runtime failure with logs first
- PRD at
prds/thumbnail-generation-debug.md
-
Achieve convex-doctor perfect score 100/100 with zero issues (2026-03-21 06:10 UTC)
- PRD at
prds/convex-doctor-perfect-score.md - Extracted 40+ helper functions from 19 large handlers across 7 files
- Refactored
packages.ts: triggerManualRefreshAll, listApprovedComponents, getRelatedComponents, getMySubmissions, scheduledDeletionCleanup, updateMySubmission, updateComponentDetails, upsertCategory, refreshGitHubIssueCounts - Refactored
seoContent.ts: generateSeoContent, generateDirectoryContent, previewDirectoryContent - Refactored
seoContentDb.ts: migrateToContentModel - Refactored
thumbnailGenerator.ts: _generateThumbnailForPackage, _autoGenerateThumbnail, _autoGenerateThumbnailWithTemplate - Refactored
seed.ts: _upsertOfficialComponent, seedOfficialComponents - Refactored
paymentsDb.ts: backfillRewardStatusFromPayments - Refactored
apiKeys.ts: generateApiKey, getApiAnalytics (from prior session) - Added strategic suppressions in
convex-doctor.tomlfor intentional design patterns - All TypeScript checks and Netlify build pass with no regressions
- Files changed:
convex/packages.ts,convex/seoContent.ts,convex/seoContentDb.ts,convex/thumbnailGenerator.ts,convex/seed.ts,convex/paymentsDb.ts,convex/apiKeys.ts,convex-doctor.toml
- PRD at
-
Fix duplicate package submission error showing generic "Server Error Called by client" (2026-03-21 00:15 UTC)
- Backend: rewrote ConvexError message to include the npm package name and actionable next steps
- Frontend: added ConvexError import and extraction in both submit and generate content catch blocks
- Files changed:
convex/packages.ts,src/pages/SubmitForm.tsx
-
Improve convex-doctor score from 39/100 to 80+ (2026-03-20 22:30 UTC)
- PRD at
prds/convex-doctor-score.md - Fixed unwaited promises in
http.tsandapiKeys.ts - Replaced
api.*withinternal.*in server-to-server calls across 4 files - Replaced
throw new Errorwiththrow new ConvexErroracross 12 convex files - Fixed
Date.now()andnew Date()in query functions across 4 files - Added
.take(n)bounds to ~40 unbounded.collect()calls - Replaced
.filter()with.withIndex()in 7 query locations - Added return validators to 10 functions missing them
- Removed redundant
by_categoryindex (prefix ofby_category_and_visibility) - Added
by_isDefaultindex toaiPromptVersionsandseoPromptVersions - Added
by_tokenIdentifier_and_statuscompound index toapiKeys - Added CORS OPTIONS handlers for 7 HTTP routes
- Batched
runAiReviewmutations (reduced ctx.run* from 13 to 8) - Created
convex.jsonandconvex-doctor.tomlconfiguration files
- PRD at
-
Fix deployed
/components/components.mdroute so it returns markdown instead of SPA HTML (2026-03-18 02:10 UTC)- Root cause:
og-meta.tsintercepts/components/*before redirects, and redirects do not fire after edge functions callcontext.next() llms.txtalready had a direct proxy branch inog-meta.ts, but/components/components.mddid not- Fixed by proxying
/components/components.mddirectly to Convex/api/markdown-indexfromog-meta.ts - Verified
npm run buildstill passes after the routing change and docs were synced - PRD at
prds/components-components-md-route-fix.md
- Root cause:
-
Upgrade Documentation viewer to use Pierre Diffs for code blocks (2026-03-18 02:00 UTC)
- Added
rehype-rawimport and plugin toDocumentation.tsxfor inline HTML support - Added
CodeBlockimport and wired fenced code blocks through Pierre Diffs (@pierre/diffs) with syntax highlighting, line numbers, and copy button - Changed
<pre>component to passthrough so Pierre Diffs handles full rendering - Added
thead,th,td,trcomponents matching ComponentDetail table styling - Added video URL detection for
.mp4,.webm,.movin image tags - Updated
updating-docs.mdto document the Pierre Diffs rendering pipeline - Updated
files.mdDocumentation.tsx description to reflect Pierre Diffs usage
- Added
-
Update API Usage Modal to use /components/components.md path (2026-03-18 00:45 UTC)
- Changed href and display text from
/components.mdto/components/components.mdin the ApiUsageModal on Profile page
- Changed href and display text from
-
Add contact email to profile help text (2026-03-18 00:40 UTC)
- Added "devx at convex . dev" contact info to the account removal help text on Profile page
-
Add admin API access controls with global toggle, per-user grants, and analytics dashboard (2026-03-18 00:30 UTC)
- Added
apiAccessGrantstable to schema for email-based admin grants - Added
apiAccessEnabledto admin settings (defaults to off) - Created admin mutations:
grantApiAccess,revokeApiAccess,searchSubmitters,listApiAccessGrants,getApiAnalytics - Added
getMyApiAccessStatuspublic query for profile page gating - Gated REST API endpoints behind global toggle (returns 503 when off)
- Gated
generateApiKeybehind both global toggle and per-user grant - Added "API" tab to Admin page with global toggle, user search/grant, and analytics dashboard
- Gated Profile page API Access section behind global + per-user flags
- Added "For Agents" section below FAQ on Directory page linking to llms.txt and components.md
- PRD at
prds/admin-api-controls.md
- Added
-
Fix /components.md 404 and add /components/components.md alias (2026-03-17 23:30 UTC)
- Root cause: Netlify redirect for
/components.mdwas missingforce = true, so the proxy to Convex never fired - Added
force = trueto the/components.mdredirect - Added
/components/components.mdas a second path that points to the same Convex endpoint - Both
llms.txtand.mdendpoints query_listApprovedPackageslive on each request, no cron needed
- Root cause: Netlify redirect for
-
Build REST API with per-user API keys for Components Directory (2026-03-17 23:00 UTC)
- Added
apiKeystable to schema withkeyHash,keyPrefix,tokenIdentifier,statusfields - Extended
mcpApiLogswithapiKeyIdandhashedIpfor per-key and per-IP tracking - Created
convex/apiKeys.tswithgenerateApiKey,revokeApiKey,getMyApiKeypublic functions and internal validation/rate-limit helpers - Built
resolveApiCallerauth middleware with two-tier rate limiting (100 req/min authenticated, 10 req/min anonymous) - Replaced disabled MCP routes in
convex/http.tswith live REST endpoints at/api/components/search,/detail,/install,/docs,/categories,/info - Added Netlify proxy redirect for
/api/components/* - Added API Access section to Profile page with key generation, display, and revocation
- Built API Usage Guide modal with endpoint docs, curl examples, rate limit info, and content endpoint links
- PRD at
prds/rest-api-keys.md
- Added
-
fix raw HTML tags rendering as text in README markdown on ComponentDetail page (2026-03-17 22:15 UTC)
- Installed
rehype-rawpackage to allowreact-markdownto parse and render inline HTML from GitHub READMEs - Added
rehypePlugins={[rehypeRaw]}to all 4ReactMarkdowninstances insrc/pages/ComponentDetail.tsx(Use Cases, How it Works, From the README, and v1 long description) - Fixes
<div align="center">,<strong>,<img>and other HTML tags that were showing as literal text - Verified with
npx vite build
- Installed
-
make README preview source toggle open by default on SubmitForm and ProfileEditSubmission (2026-03-17 21:00 UTC)
- Changed
ReadmePreviewNoticedefault state from closed to open (useState(true)andopenattribute on<details>) - Affects both
SubmitForm.tsxandProfileEditSubmission.tsxsince they share the same component
- Changed
-
remove broken "View markdown source" option from Markdown dropdown on ComponentDetail page (2026-03-17 20:15 UTC)
- Removed the toggle button from the dropdown menu in
src/pages/ComponentDetail.tsx - Removed the associated markdown source view panel (pre block with raw markdown)
- Cleaned up unused
showMarkdownstate,mdCopiedstate,handleCopyMdInlinefunction, andEyeOpenIconimport - Remaining dropdown options (Open markdown file, Copy as Markdown, Copy page URL, Open in ChatGPT/Claude/Perplexity) are unchanged
- Removed the toggle button from the dropdown menu in
-
hide "Add badge to your README" section on ComponentDetail page while keeping it on Profile, Submit, and other pages (2026-03-17 19:30 UTC)
- Removed badge markdown snippet, copy button, and preview image from
src/pages/ComponentDetail.tsx - Kept the standalone
View llms.txtlink visible on the detail page - Badge section remains unchanged on
src/pages/Profile.tsx,src/pages/Submit.tsx, and other surfaces
- Removed badge markdown snippet, copy button, and preview image from
-
fix SKILL.md (Download Skill) not generated during submit, profile edit, or content model migration (2026-03-17 18:45 UTC)
- Extracted
buildSkillMdFromContenttoshared/buildSkillMd.tsso it can be imported by both "use node" action files and mutation files submitPackageinconvex/packages.tsnow buildsskillMdwhen v2 content fields are present at submission timeupdateMySubmissioninconvex/packages.tsnow rebuildsskillMdwhen v2 content is saved via profile editmigrateToContentModelinconvex/seoContentDb.tsnow backfillsskillMdfor packages that have v2 content but no skill fileupdateGeneratedContent(admin edit) inconvex/seoContentDb.tsnow auto-rebuildsskillMdwhen content fields change_addPackageaccepts optionalskillMdarg and saves it on insert- Verified with
npm run buildandnpx convex typecheck
- Extracted
-
refactor detail page markdown rendering to use unified markdown-body CSS class (2026-03-17 17:53 UTC)
- Added
.markdown-bodyclass insrc/index.csswith GitHub-style heading hierarchy (h1/h2 with bottom borders, proper size progression), nested list bullet types, inline code, blockquote, GFM table, and task list checkbox styles - Replaced 4 duplicated inline Tailwind
[&_*]overrides insrc/pages/ComponentDetail.tsxwith singlemarkdown-bodywrapper - Fixed broken heading hierarchy where v1 long description forced h1/h2 to tiny uppercase text
- Simplified
src/components/markdownComponents.tsxby removing heading/paragraph/list overrides (handled by CSS) and adding shared img component with video detection - Verified with
npm run build
- Added
-
add side-by-side editor and preview layout to ProfileEditSubmission content section (2026-03-17 15:25 UTC)
- Description, Use Cases, and How it Works sections now render as two-column grid on desktop (editor left, preview right) and stack on mobile
- Added live markdown preview to Description (previously had none)
- Preview panes scroll independently with min/max height constraints
- README preview stays full-width since it is read-only
-
make Package, Repo, and npm values clickable links in ProfileEditSubmission info box (2026-03-17 15:28 UTC)
- Package links to the component detail page
- Repo and npm open in new tabs with
target="_blank"
-
unify admin, submit, and profile content generation to use the same v2 prompt and flow (2026-03-17 06:44 UTC)
- Admin action bar "Regenerate SEO + Skill" button now calls
regenerateDirectoryContent(v2) instead ofregenerateSeoContent(v1), renamed to "Generate Content" buildContentPromptinconvex/seoContent.tsnow accepts an optionalcustomTemplateparameter so admin custom prompts apply to all three surfaces- Both
generateDirectoryContentandpreviewDirectoryContentnow load the admin custom prompt via_getSeoActivePromptContent - Admin prompt settings panel renamed from "SEO + SKILL.md Prompt" to "Component Directory Content Prompt" with updated description and v2 placeholders
- Default prompt in
convex/aiSettings.tsswitched fromDEFAULT_SEO_PROMPT_TEMPLATEtoDEFAULT_CONTENT_PROMPT_TEMPLATE - Verified with
npm run buildandnpx convex typecheck
- Admin action bar "Regenerate SEO + Skill" button now calls
-
change user rate limit from 1/hour to 5/hour, admin stays exempt (2026-03-17 06:44 UTC)
- Updated
MAX_CONTENT_GENERATIONS_PER_WINDOWfrom 1 to 5 inconvex/contentGenerationLimits.ts - Warning modal text in
src/pages/SubmitForm.tsxandsrc/pages/ProfileEditSubmission.tsxupdated to say "5 times per hour" - Admin remains exempt since it uses internal action scheduling
- Updated
-
add GitHub-style markdown rendering with table support and vertical rhythm (2026-03-17 06:26 UTC)
- Created shared
src/components/markdownComponents.tsxwith component overrides for code blocks, tables, headings, lists, blockquotes, and horizontal rules - All
ReactMarkdowninstances insrc/pages/SubmitForm.tsx,src/pages/ProfileEditSubmission.tsx, andsrc/pages/ComponentDetail.tsxnow use the shared components - Tables render with borders, header backgrounds, cell padding, alternating row shading, and horizontal scroll
- Headings get proper top margin (
mt-6for h1/h2,mt-4for h3,mt-3for h4) so README sections do not collide - Removed duplicate inline code/pre component definitions from all three pages
- Verified with
npm run build
- Created shared
-
add "From the README.md" heading and hr separator on detail page (2026-03-17 06:15 UTC)
- Added
<hr>and<h3>From the README.md</h3>above the README markdown section insrc/pages/ComponentDetail.tsx - Also added the heading to the
buildComponentMarkdownexport so llms.txt output stays consistent - Removed extra wrapper div that was left from the old
border-tapproach - Verified with
npm run build
- Added
-
add pulsing AI loading indicator to all generation surfaces (2026-03-17 06:08 UTC)
- Created shared
src/components/AiLoadingDots.tsxusing PhosphorDotsNinewithanimate-pulseand "AI is working" label - Swapped into
src/pages/SubmitForm.tsxgenerate button and warning modal confirm button - Swapped into
src/pages/ProfileEditSubmission.tsxgenerate button and warning modal confirm button - Swapped into
src/pages/Admin.tsxRegenerate SEO + Skill button and content migration Generate button and status text - Verified with
npm run build
- Created shared
-
fix stored README markdown containing prompt prefix text (2026-03-17 06:04 UTC)
fetchGitHubReadmeinconvex/seoContent.tsnow returns bothcontent(prefixed, for the AI prompt) andrawContent(clean, for storage)- Both
extractReadmeIncludeBlockcall sites now userawContentso savedreadmeIncludedMarkdownno longer starts with "From the README.md" - Existing records will be clean after next regeneration
- Verified with Convex typecheck
-
fix React hooks order error in ProfileEditSubmission (2026-03-17 06:00 UTC)
- Moved
canGenerateandhandleOpenGenerateWarningabove all early returns so hooks run unconditionally canGeneratenow guards against nullsubmissionsince it runs before the loading/null checks- Admin SEO actions confirmed exempt from the rate limit since they use separate internal action paths
- Verified with TypeScript check
- Moved
-
add content generation cooldown and warning modal to submit and profile edit (2026-03-17 05:53 UTC)
- Added a backend
once per hour per signed-in accountlimit for the generated content preview action used by both submit and profile edit flows - Added warning modals in
src/pages/SubmitForm.tsxandsrc/pages/ProfileEditSubmission.tsxthat ask users to only regenerate when really needed - Updated the shared preview action call sites to pass source metadata and surface the backend rate-limit message cleanly
- Verified with
npm run lint
- Added a backend
-
hide the component detail
llms.txtlink when SEO visibility is hidden (2026-03-16 22:49 UTC)- Updated
src/pages/ComponentDetail.tsxso the standaloneView llms.txtlink uses the same hidden SEO visibility gate as the generated SEO and SKILL sections - Kept the change scoped to detail page rendering only
- Verified with
npm run buildand confirmed the Netlify production build passes
- Updated
-
capitalize visible component detail description heading and sync session docs (2026-03-16 21:47 UTC)
- Added
capitalizeHeadingText()insrc/pages/ComponentDetail.tsxso the visible{Component Name} Descriptionheading uses capitalized component text - Left AI generated SEO content unchanged and scoped the change to the visible long description
h2 - Updated
task.md,changelog.md, andfiles.mdfor this session - Verified with
npm run buildand confirmed the Netlify production build passes
- Added
-
add editable SEO content fields to admin Component Details editor (2026-03-14 UTC)
- Created
updateSeoContentpublic admin mutation inconvex/seoContentDb.tsthat patches SEO fields directly without AI regeneration - Extracted
SeoContentSectioncomponent insrc/components/ComponentDetailsEditor.tsxwith inline editing for all SEO fields (value prop, benefits, use cases, FAQ, resource links, SKILL.md) - All textarea fields use
resize-yso admins can drag to expand - Passed
seoBenefits,seoUseCases,seoFaq,seoResourceLinksfromsrc/pages/Admin.tsxthrough to the editor - Confirmed AI SEO only triggers from Regenerate button or auto-generate admin setting
- Verified with
npx tsc --noEmitandnpm run build(Netlify build passes)
- Created
-
add approved date sort view to admin submissions (2026-03-13 22:33 UTC)
- Added a
Recently approvedoption to the Package Submissions sort dropdown insrc/pages/Admin.tsx - Sort now uses existing
approvedAtdata with submitted date fallback for items that do not have an approval timestamp - When that sort is active, the row date and expanded calendar tooltip show the approval date instead of the submission date
- Verified with a lint pass on
src/pages/Admin.tsx - Verified Netlify production build with
npm run build(2026-03-13 22:35 UTC)
- Added a
-
finish admin review history reviewed by placement and sync session docs (2026-03-13 21:40 UTC)
- Removed the duplicate
Reviewed byline from the expanded package card insrc/pages/Admin.tsx - Kept
Reviewed byvisible only inside the AI Review History drawer detail pane - Synced
task.md,changelog.md, andfiles.mdfor this session update - Verified the Netlify build command with
npm run build
- Removed the duplicate
-
Fix reward status guard: prevent sending rewards for packages not in review or approved (2026-03-13 20:00 UTC)
- Added
reviewStatuscheck inconvex/payments.tssendRewardaction, rejecting if status is notin_revieworapproved - Disabled Send Reward button in
src/pages/Admin.tsxfor packages with wrong status, with descriptive tooltip - Added
backfillRewardStatusFromPaymentsmutation inconvex/paymentsDb.tsto reconcile orphaned Tremendous payments with packagerewardStatus/rewardTotalAmount
- Added
-
Add collapsible author info toggle in admin package cards (2026-03-13 20:15 UTC)
- Extracted
AuthorToggleSectioncomponent insrc/pages/Admin.tsxthat wrapsSubmitterEmailEditorbehind a show/hide toggle - Author info (email, name, Discord) is hidden by default, reducing visual clutter per package card
- Styled to match Component Details and Package Metadata boxes (rounded border, uppercase header, subtitle)
- Extracted
-
Make all admin toggle boxes click-to-expand (2026-03-13 21:30 UTC)
- Updated Component Details, Package Metadata, and Component Author boxes so the entire header row is clickable to expand/collapse
- Replaced inner
<button>elements with accessible clickable<div>wrappers (role=button, tabIndex, Enter/Space keyboard support) - Pill label on the right remains as a visual indicator
Session updates complete on 2026-03-12 22:45 UTC.
-
add video support in long description markdown rendering (2026-03-12 22:45 UTC)
- Added
imgandacomponent overrides toReactMarkdowninsrc/pages/ComponentDetail.tsx - URLs ending in
.mp4,.webm, or.movnow render as native<video>elements with controls instead of broken<img>tags or gray boxes - Fixes the issue where GitHub README videos (like
SelfHosting.mp4) showed as unplayable content on component detail pages - Verified with
npm run build
- Added
-
update AI review prompt to v6 with package entry point checks and wrapper guidance (
prds/ai-review-prompt-v6.md) (2026-03-13 04:39 UTC)- Added a new critical criterion for required package entry points in
package.json, including./convex.config.jsand./_generated/component.js - Reframed component source discovery so top-level
convex/is not treated as a normal packaged component pattern without supporting package evidence - Clarified that hooks, classes, and helper APIs may be exported by the package while component functions remain server-only across the boundary
- Expanded
convex/aiReview.tsGitHub repo snapshots to includepackage.jsonplus visible client and test entry files - Mirrored the same v6 prompt in
convex/aiSettings.tsand bumped shared metadata inshared/aiReviewPromptMeta.ts
- Added a new critical criterion for required package entry points in
-
add shareable WorkOS admin auth feedback PRD (
prds/workos-admin-feedback-request.md) (2026-03-10 01:04 UTC)- Summarized how this app grants admin access from WorkOS claims in
convex/auth.ts - Documented that admin access is domain based on
identity.emailending with@convex.dev, not a single hardcoded email - Added a short WorkOS feedback question list covering admin claims, roles, and JWT template best practices
- Summarized how this app grants admin access from WorkOS claims in
-
link component detail categories to category pages and sync admin category slug lifecycle (
prds/category-detail-link-and-admin-sync.md) (2026-03-09 05:19 UTC)- Linked the detail sidebar category pill to
/components/categories/:slugonly when the category still maps to an enabled public category - Synced detail markdown export to the same resolved admin-managed category label used in the UI
- Migrated
packages.categoryvalues on category slug edits and cleared them on category deletes inconvex/packages.ts - Added admin identity checks to category admin queries and mutations and verified with Convex typecheck, lint, and
npm run build
- Linked the detail sidebar category pill to
-
fix category page pagination and root directory links (
prds/category-page-pagination-and-root-links.md) (2026-03-09 05:11 UTC)- Increased category page pagination from 12 to 24 items before
Page X of Yappears - Normalized breadcrumb, back links, sidebar root links, and mobile "All" links to
/components/ - Updated
src/main.tsx,files.md, andchangelog.mdto keep routing behavior and docs in sync
- Increased category page pagination from 12 to 24 items before
-
Add Discord username to component detail sidebar and admin editable submitter info (2026-03-09 21:55 UTC)
- Added
submitterDiscordtopublicPackageValidatorandtoPublicPackage()so the detail page can display it - Added Discord row in
ComponentDetail.tsxsidebar with PhosphorDiscordLogoicon linking to Convex community Discord - Expanded
SubmitterEmailEditorinAdmin.tsxto include editable Name and Discord fields with copy buttons - Added
updateSubmitterInfoadmin mutation inconvex/packages.ts - Verified with
npm run build
- Added
-
update AI review prompt to v4 to prevent false failures on internal functions (2026-03-09 06:45 UTC)
- Criterion 5 now explicitly exempts
internalQuery,internalMutation, andinternalActionfrom the validator check - Added IMPORTANT bullet and updated JSON response template notes in the system prompt
- Applied to both
convex/aiReview.tsandconvex/aiSettings.ts - Verified with TypeScript check and
npm run build
- Criterion 5 now explicitly exempts
-
fix admin category save perception and large category visibility (
prds/category-save-and-large-category-visibility.md) (2026-03-08 23:25 UTC)- Synced
ComponentDetailsEditorstate with reactive backend props and kept explicit category clearing support in the admin save flow - Added a remount key in
src/pages/Admin.tsxso saved package detail props reset the editor cleanly - Updated
src/pages/Directory.tsxto restore pagination for all views including selected categories - Pagination shows 12 cards initially (4 columns x 3 rows on desktop) with "Load more" for additional items
- Verified with Convex mutation success logs, lint checks, and
npm run build
- Synced
-
fix directory category selection scroll position (2026-03-08 22:13 UTC)
- Updated
src/pages/Directory.tsxso category selection runs through a shared handler for desktop and mobile filters - Added smooth scroll reset to the top of the directory header after a category change so the new results are visible immediately
- Synced
files.mdandchangelog.mdfor this session change
- Updated
-
fix preflight.ts crypto module error (2026-03-08 23:15 UTC)
- Changed
hashIpfrom Node.jscrypto.createHash()to Web Crypto APIcrypto.subtle.digest() - The default Convex runtime does not have access to Node.js built-in modules
- Updated
convex/http.tsto handle the now-asynchashIpfunction - Verified with
npx convex codegen,npx tsc -p convex/tsconfig.json --noEmit --pretty false, andnpm run build
- Changed
-
restore optional auto approve and auto reject outcomes behind auto AI review (
prds/admin-auto-ai-review-and-logo-thumbnail-gating.md) (2026-03-08 22:01 UTC)- Brought back
Auto-approve on passandAuto-reject on failwhile keepingAuto AI reviewas the top level trigger - Kept
Auto AI reviewoff by default and made the two outcome toggles depend on it in the Admin UI - Updated backend settings and AI review completion logic so optional approval or rejection automation runs only when
autoAiReviewis enabled - Supersedes the earlier single-toggle-only automation pass from the same session
- Verified with
npx convex codegen,npx tsc -p convex/tsconfig.json --noEmit --pretty false, andnpm run build
- Brought back
-
add public preflight checker for component validation (
prds/public-preflight-checker.md) (2026-03-08 22:30 UTC)- Extracted shared review helper
runReviewOnRepofromconvex/aiReview.tsso admin and public checks use the same logic - Added
runPreflightCheckinternal action that runs review without persisting topackagestable - Added
preflightCheckstable inconvex/schema.tsfor rate limiting and result caching - Added
/api/preflightHTTP endpoint with IP-based rate limiting (10 checks/hour), in-flight limits (1 concurrent), and 30-minute result caching - Created
convex/preflight.tswith helper functions for IP hashing, URL normalization, and internal queries and mutations - Created
src/pages/SubmitCheck.tsxwith form input, loading states, and detailed results display including critical and advisory criteria - Added route for
/components/submit/checkinsrc/main.tsx - Added preflight check link in
src/pages/SubmitForm.tsxbelow the header with icon and description - Verified with
npx convex codegen, TypeScript checks, andnpm run build
- Extracted shared review helper
-
replace auto approve or reject with auto AI review workflow (
prds/admin-auto-ai-review-and-logo-thumbnail-gating.md) (2026-03-08 19:17 UTC)- Replaced the Admin AI automation toggle pair with a single
Auto AI reviewsetting that queues review jobs and moves eligible packages intoin_review - Turning the setting on now queues current pending packages that have repository URLs and leaves final approval or rejection to admins
- Verified with
npx convex codegen,npx tsc -p convex/tsconfig.json --noEmit --pretty false, andnpm run build
- Replaced the Admin AI automation toggle pair with a single
-
gate auto submit thumbnail generation to logo backed submissions and clarify the admin setting copy (2026-03-08 19:17 UTC)
- Confirmed
saveLogoremains the only submit-time auto thumbnail trigger, so submissions without a logo are skipped - Updated the Admin settings copy to explicitly state the logo requirement for automatic thumbnail generation
- Confirmed
-
update docs for the admin AI review automation change after verification (2026-03-08 19:17 UTC)
- Added PRD
prds/admin-auto-ai-review-and-logo-thumbnail-gating.md - Synced
task.md,changelog.md, andfiles.mdwith the new automation workflow
- Added PRD
-
add shared git and Cursor collaboration workflow PRD (
prds/git-cursor-shared-repo-workflow.md) (2026-03-08 17:39 UTC)- Added a team workflow guide for working in the same repo with another developer using both Git CLI and Cursor's Commit and Sync UI
- Documented the recommended branch first workflow plus a safe direct to
mainfallback usinggit pull --rebase origin main - Included quick safety checks for ahead, behind, and diverged branch states before using Cursor
Sync
-
update AI review prompt to v3 with repo-based critical pass criteria and advisory notes (
prds/ai-review-prompt-v3.md) (2026-03-08 17:16 UTC)- Archived the previous default AI review prompt v2 into
prds/ai-review-prompt-v3.md - Updated
convex/aiReview.tsandconvex/aiSettings.tsto use a v3 prompt that judges component validity from the linked GitHub repository, not a published npm tarball - Split review output into 8 critical pass criteria and 4 advisory notes, while keeping the Admin JSON response shape unchanged
- Updated runtime status scoring so advisory misses do not block a valid component from receiving
passed - Ran
npx convex codegen,npx tsc -p convex/tsconfig.json --noEmit --pretty false, andnpm run build - Smoke tested
aiReview:runAiReviewagainst the stored@convex-dev/stripepackage and confirmed the review completed withaiReviewStatus: "passed"
- Archived the previous default AI review prompt v2 into
-
add admin ai review history panel (
prds/admin-ai-review-history.md) (2026-03-08 06:06 UTC)- Added persistent
aiReviewRunsstorage so each AI review now records a durable run without changing the existing latest review snapshot behavior - Added admin history query plus a right-side review history drawer for previous review scores, summaries, criteria, provider metadata, raw output, and failures
- Verified with
npx convex codegen,npx tsc -p convex/tsconfig.json --noEmit --pretty false, andnpm run build
- Added persistent
-
allow admin to delete older AI review history runs (2026-03-08 17:04 UTC)
- Added backend deletion guard so admins can remove saved
aiReviewRunsentries while the latest snapshot stays protected - Added delete controls and confirmation flow in the AI review history drawer for past runs only
- Verified with
npx convex codegen,npx tsc -p convex/tsconfig.json --noEmit --pretty false, andnpm run build
- Added backend deletion guard so admins can remove saved
-
let escape close ai review history drawer (2026-03-08 17:05 UTC)
- Added
Escapekey handling to the AI review history drawer insrc/pages/Admin.tsx - Keeps the confirm dialog safe by only closing the drawer on
Escapewhen a delete confirmation is not open - Verified with
npm run build
- Added
-
sync session docs for Tremendous reward flow and component visibility prompt clarification (2026-03-08 01:18 UTC)
- Synced
files.md,changelog.md, andTASK.mdfor the Tremendous reward flow session and the follow-up component visibility prompt clarification - Clarified that wrapper or app calls across a Convex component boundary must target public component functions, while same-component implementation details should use
internal* - Verified
npm run buildpasses for the Netlify production build flow
- Synced
-
add admin settings jump navigation (2026-03-08 00:49 UTC)
- Added anchored section wrappers for each block in the Admin settings tab
- Added a sticky jump bar for smaller screens and switched the desktop settings nav to a sticky in-layout sidebar on extra-wide screens
- Moved sticky positioning onto the desktop sidebar container so the rail stays pinned while scrolling the settings page
- Kept existing settings panels and feature behavior unchanged while making the long page easier to navigate
-
setup tremendous (
prds/tremendous-rewards-working-setup.md) (2026-03-07 02:25 UTC)- Working setup uses
convex/payments.tsfor Node actions andconvex/paymentsDb.tsfor queries and mutations - Uses Tremendous REST API via
fetch()with normalized sandbox or production base URLs - Campaign safe payload now avoids sending
productswhenTREMENDOUS_CAMPAIGN_IDis present - Admin UI includes Send Reward, PaymentBadge, RewardSettingsPanel, reward history modal, and settings-only test reward flow
- Working setup uses
-
add Tremendous settings test reward (
prds/tremendous-settings-test-reward.md) (2026-03-08 00:41 UTC)- Added settings-only
Send Test Rewardaction inRewardSettingsPanel - Test reward sends to
TREMENDOUS_TEST_RECIPIENT_EMAILand records apaymentsrow withisTest: true - Test payments do not patch
packages.rewardStatusorpackages.rewardTotalAmount - Test payments are excluded from reward stats totals
- Added settings-only
-
add reward history modal and count in admin (
prds/admin-reward-history-modal.md) (2026-03-07 06:10 UTC)- Added reward history count pill next to the Reward button in
src/pages/Admin.tsx - Added reward history modal showing past payment attempts, including test payments, statuses, amounts, recipient email, notes, and Tremendous link when available
- Reused existing
api.paymentsDb.getPaymentsForPackagequery and existing admin modal styling
- Added reward history count pill next to the Reward button in
-
fix logout on submit page
-
add admin
-
Admin dashboard default filter changed from "pending" to "all" (2026-03-07 00:35 UTC)
-
Directory category sections now show 3 rows before "Load more" (2026-03-07 00:35 UTC)
- Changed
groupedCardsPerLoadfromgridColumns * 2togridColumns * 3
- Changed
-
fix image meta (2026-03-06 UTC)
- Final fix reverts
og:imageback to the known working rawthumbnailUrlstorage format - Updated
og-meta.tsedge function to emitcomponent.thumbnailUrldirectly - Updated
ComponentDetail.tsxclient-side SEO to usecomponent.thumbnailUrlagain - Removed the unused
/api/og-imageendpoint and/components/og/*Netlify redirect - Social crawlers now see the original working image URL format like
https://giant-grouse-674.convex.cloud/api/storage/...
- Final fix reverts
-
revert OG image proxy path to raw thumbnail URLs (
prds/og-image-meta-revert.md) (2026-03-06 22:54 UTC)- Reverted both server side and client side OG image generation to direct storage URLs
- Removed the unused OG proxy backend and Netlify route
- Kept badge routing unchanged since the dedicated badge edge proxy is the known working pattern
-
share
-
test submitting
- Commented out MCP ready badge in AgentInstallSection.tsx
- Commented out all MCP routes in convex/http.ts
- Kept Copy prompt, Agent friendly summary, llms.txt, and markdown features working
-
npm security scanner
-
check api ai model
-
add posthog
-
Updated badge SVG colors to match frontend status pills and shields.io styling (2026-03-06 21:45 UTC)
- Changed left box from
#2a2825to#555555(shields.io gray) - Approved:
#228909(Convex Verified green) - In Review:
#2563eb(frontend blue pill) - Changes Requested:
#ea580c(frontend orange pill) - Updated
badge-palette-preview.htmlpreview file
- Changed left box from
-
Replace Delete Account with "Need help?" guidance on Profile page (2026-03-06 UTC)
- Removed DeleteAccountModal component and all delete account state/logic
- Replaced red "Delete Account" section with neutral "Need help?" section
- Users now use existing "Send Request" button to contact Convex team for component removal or account changes
- Removed unused
UserMinusanduseMemoimports
-
Removed MCP Server references from
/api/llms.txtand/api/markdown-indexendpoints (2026-03-06 UTC)- Endpoints were still advertising disabled MCP protocol URLs
- Removed "MCP Server" section from llms.txt output
- Removed "MCP Server Integration" section from markdown-index output
- Kept
MCP_DIRECT_ORIGINconstant for future MCP re-enablement
-
fix mcp (2026-03-06 06:45 UTC)
-
badge shield on each component page (2026-03-06 09:15 UTC)
-
Added badge preview with image to ComponentDetail.tsx
-
[x]Fixed edge function conflict blocking badge endpoint
-
Updated og-meta.ts to skip both "badge" and "badge/*" paths so badge redirects work
-
Updated badge endpoint docs in src/docs/badges.md and src/docs/api-endpoints.md to use /components/badge/
-
Added dedicated Netlify edge function
component-badge.tsfor/components/badge/*to bypass SPA fallback and proxy badge SVG directly -
[x]Verified production build passes with
npm run build(2026-03-06 UTC) -
Updated fix plan and PRD with final working badge routing pattern
-
Added local
badge-palette-preview.htmlwith badge/status color previews and added it to.gitignore -
Submission badge sync rollout (2026-03-06 01:45 UTC)
- Added
isSlugTaken()andgenerateUniqueSlug()helpers for slug uniqueness inconvex/packages.ts - Updated
addPackage,generateSlugForPackage,generateMissingSlugs,updateComponentDetailsfor collision safe slug handling - Added
BadgeSnippetcomponent tosrc/pages/Submit.tsxfor README badge copy and preview - Added
BadgeSnippetcomponent tosrc/pages/Profile.tsxfor owner facing badge access - Badges auto sync with review status at request time (no caching)
- Admin backfill through existing slug migration UI now uses uniqueness guards
- Added
-
Temporarily disable MCP UI and backend routes (2026-03-06 UTC)
-
Removed MCP Server references from public llms.txt and markdown-index endpoints (2026-03-06 UTC)
-
Show package license above category in
src/pages/ComponentDetail.tsx(2026-03-06 UTC)- Added License metadata block in the sidebar above Category
- Reads from existing
getComponentBySlugpackage payload, so Admin auto refresh updates license automatically on detail pages
-
Updated
files.md,changelog.md, andtask.mdfor this session change (2026-03-06 UTC) -
[x]check all routes for mcp and md and llms.text
- Diagnosed
@anthropic-ai/mcp-server-fetchremoved from npm (404) breaking all MCP installs (2026-03-06 06:30 UTC) - Wrote PRD at
prds/mcp-streamable-http-migration.md(2026-03-06 06:30 UTC) - Added GET handler for
/api/mcp/protocolreturning server discovery info (2026-03-06 06:40 UTC) - Updated protocol version to
2025-03-26(MCP Streamable HTTP spec) (2026-03-06 06:40 UTC) - Updated CORS headers for MCP transport (
Accept,Mcp-Session-Id,Mcp-Protocol-Version) (2026-03-06 06:40 UTC) - Migrated
cursor-installandcursor-install-componentendpoints from command/args to url config (2026-03-06 06:40 UTC) - Migrated
src/lib/mcpProfile.ts: all 4 generator functions now use url-based config (2026-03-06 06:42 UTC) - Updated
shared/mcpTypes.tsCursorInstallLinkinterface to{url: string}(2026-03-06 06:43 UTC) - Updated
src/docs/mcp.mdwith new config examples for Cursor, Claude Desktop, ChatGPT (2026-03-06 06:44 UTC) - Zero type errors, zero remaining references to dead package (2026-03-06 06:45 UTC)
- Updated
files.md,changelog.md,task.md(2026-03-06 06:50 UTC)
- Changed all
netlify.tomlredirect targets fromthird-hedgehog-429.convex.site(dev) togiant-grouse-674.convex.site(prod) (2026-03-06 07:15 UTC) - Added MCP API proxy redirects
/api/mcp/*and/components/api/mcp/*before SPA fallback (2026-03-06 07:15 UTC) - Added badge API proxy redirect
/components/badge/*(2026-03-06 07:15 UTC) - Verified build passes with zero type errors (2026-03-06 07:15 UTC)
- Updated
changelog.md,task.md(2026-03-06 07:15 UTC)
- Read
prds/deploy-commands.mdand confirmed production app host mapping (components-directory.netlify.app) (2026-03-06 08:00 UTC) - Verified
https://www.convex.dev/components/api/mcp/protocolreturns SPA HTML, not MCP JSON (2026-03-06 08:00 UTC) - Verified
https://components-directory.netlify.app/components/api/mcp/protocolreturns SPA HTML and/api/mcp/protocolreturns Netlify 404 (2026-03-06 08:00 UTC) - Verified direct Convex MCP endpoint
https://giant-grouse-674.convex.site/api/mcp/protocolworks for both GET discovery and POST initialize (2026-03-06 08:00 UTC) - Updated
files.md,changelog.md, andtask.mdwith session findings and immediate fallback guidance (2026-03-06 08:00 UTC)
- Created PRD for temporary direct MCP fallback rollout (2026-03-06 08:17 UTC)
- Updated
src/lib/mcpProfile.tsso Cursor, Claude Desktop, and ChatGPT configs usehttps://giant-grouse-674.convex.site/api/mcp/protocol(2026-03-06 08:17 UTC) - Updated
convex/http.tsMCP discovery metadata and backend Cursor install payloads to use the same direct MCP origin (2026-03-06 08:17 UTC) - Updated
src/docs/mcp.md,files.md,changelog.md, andtask.mdto document the temporary fallback (2026-03-06 08:17 UTC) - Verify deployed install flow in Cursor, Claude Desktop, and ChatGPT against the direct endpoint
- Analyzed current
buildSkillMd()implementation against Anthropic skill creator guidelines (2026-03-06 UTC) - Added
buildTriggerContexts()helper for "pushy" description fields (2026-03-06 UTC) - Updated description field to include dynamic trigger contexts from category, tags, and use cases (2026-03-06 UTC)
- Changed instructions to imperative form per Anthropic guidelines (2026-03-06 UTC)
- Added "When NOT to use" section to prevent over-triggering (2026-03-06 UTC)
- Updated SEO + SKILL.md Prompt panel description in Admin.tsx to document new format (2026-03-06 UTC)
- Updated
files.md,changelog.md, andtask.md(2026-03-06 UTC)
- Created
netlify/edge-functions/og-meta.tsto serve dynamic OG tags to bots (2026-03-05 23:45 UTC) - Updated
netlify.tomlwith edge function registration on/components/*(2026-03-05 23:45 UTC) - Updated
files.md,changelog.md,task.md(2026-03-05 23:50 UTC) [x] fix opengraph view (2026-03-06 06:15 UTC)
- Diagnosed v1 failure: opengraph.xyz uses headless Chrome without bot UA (2026-03-06 06:05 UTC)
- Rewrote
og-meta.tsto inject meta tags into SPA HTML for all requests (2026-03-06 06:10 UTC) - Verified regex handles multi-line meta tags in production HTML (2026-03-06 06:12 UTC)
- Verified slug extraction excludes static assets and reserved paths (2026-03-06 06:13 UTC)
- Created PRD at
prds/opengraph-meta-fix.md(2026-03-06 06:15 UTC) - Updated
files.md,changelog.md,task.md(2026-03-06 06:15 UTC) - Deploy and verify with opengraph.xyz
- Archived original AI review prompt to
prds/ai-review-prompt-v1.md(2025-03-05 21:30 UTC) - Updated
convex/aiSettings.tsDEFAULT_REVIEW_PROMPT to v2 (2025-03-05 21:30 UTC) - Updated
convex/aiReview.tsREVIEW_CRITERIA and default prompt template to v2 (2025-03-05 21:30 UTC) - Fixed false negative: only exported query/mutation/action need returns validators, not helper functions (2025-03-05 21:30 UTC)
- Fixed false positive: public API functions should NOT use internal* (2025-03-05 21:30 UTC)
- Added ctx.auth unavailability note and auth callback pattern guidance (2025-03-05 21:30 UTC)
- Updated "How AI Review Works" section in Admin settings panel to match v2 criteria (2025-03-05 22:00 UTC)
- Updated
files.md,changelog.md, andtask.md(2025-03-05 22:00 UTC)
- Add
search_componentNameindex to schema (2026-03-05 22:12 UTC) - Add
search_repositoryUrlindex to schema (2026-03-05 22:12 UTC) - Update
adminSearchPackagesto search componentName and repositoryUrl (2026-03-05 22:12 UTC) - Verify Convex functions compile successfully (2026-03-05 22:12 UTC)
- Update
files.md,changelog.md, andtask.md(2026-03-05 22:15 UTC) - Fix submit form markdown mini preview rendering (headings, lists) and add 500 char limit (2026-03-05 23:25 UTC)
- update routes for mcp
- Fix long description markdown line breaks and purple hover-link styling on component detail page (PRD:
prds/markdown-long-description-rendering-and-preview.md) (2026-03-05 23:08 UTC) - Add safe markdown long description support notes and mini preview in submit form (PRD:
prds/markdown-long-description-rendering-and-preview.md) (2026-03-05 23:08 UTC) - Verify markdown rendering behavior and update docs (
task.md,changelog.md,files.md) (2026-03-05 23:08 UTC)
- Add platform toggle tabs (Cursor, Claude, ChatGPT) to AgentInstallSection (2026-03-04 20:10 UTC)
- Add Claude Desktop config generator and manual setup instructions (2026-03-04 20:08 UTC)
- Add ChatGPT custom connector setup instructions (2026-03-04 20:08 UTC)
- Test all three platform MCP install flows (2026-03-04 20:15 UTC)
- Update files.md, changelog.md, task.md (2026-03-04 20:15 UTC)
- Switch MCP install URLs to live public
/components/apipath and refresh docs (2026-03-05 00:10 UTC)
- Audited all docs against files.md and changelog.md for missing features (2026-03-04 22:30 UTC)
- Created mcp.md covering MCP protocol, REST API, Cursor install, agent prompts (2026-03-04 22:30 UTC)
- Created api-endpoints.md covering llms.txt, markdown, badge SVG, Netlify aliases (2026-03-04 22:30 UTC)
- Created badges.md covering README badge endpoint, usage, and analytics (2026-03-04 22:30 UTC)
- Updated 9 existing docs with missing feature details (2026-03-04 22:30 UTC)
- Added "Integrations" nav group in Documentation.tsx (2026-03-04 22:30 UTC)
- Verified build passes and updated files.md, changelog.md, task.md (2026-03-04 22:30 UTC)
- Improve Documentation.tsx markdown rendering for tables, code blocks, lists, blockquotes, and related rich markdown formats (2026-03-04 21:24 UTC)
- Verify
npm run buildpasses after markdown rendering updates (2026-03-04 21:24 UTC) - Update
files.md,changelog.md, andtask.mdwith session changes (2026-03-04 21:24 UTC)
- Changed filter tabs from horizontal scroll to flex wrap (2026-03-04 19:00 UTC)
- Changed filter tab tooltips to position above instead of below (2026-03-04 19:00 UTC)
- Added
verified,community, andfeaturedsort modes insrc/pages/Admin.tsx(2026-03-05 21:53 UTC) - Added dropdown options
Verified first,Community first, andFeatured first(2026-03-05 21:53 UTC) - Verified sort stability with newest-date fallback tie-breaker (2026-03-05 21:53 UTC)
- Updated
files.md,changelog.md, andtask.mdfor this session (2026-03-05 21:53 UTC)
- Create PRD with UI design and file structure plan (2026-03-04 12:00 UTC)
- Create 13 markdown documentation files in
src/docs/covering user guide and admin guide topics (2026-03-04 12:15 UTC) - Create
Documentation.tsxcomponent with admin gating and markdown rendering (2026-03-04 12:20 UTC) - Add documentation route to
main.tsxrouter at/components/documentation/:section?(2026-03-04 12:25 UTC) - Add "documentation" to reserved routes in
src/lib/slugs.ts(2026-03-04 12:25 UTC) - Add TypeScript declarations for
*.md?rawimports (2026-03-04 12:25 UTC) - Add "Docs" link to Header.tsx nav bar for admins (2026-03-04 12:35 UTC)
- Use client-side section navigation in Documentation.tsx to avoid full reload and spinner between doc pages (2026-03-04 19:20 UTC)
- Update
files.md,changelog.md, andtask.md(2026-03-04 12:35 UTC)
- Add internal provider settings query for failover candidate selection in
convex/aiSettings.ts(2026-03-04 02:29 UTC) - Add shared failover helper to build candidate chain and execute fallback in
convex/aiProviderFallback.ts(2026-03-04 02:29 UTC) - Wire failover chain into
convex/aiReview.tsso runtime provider errors fall through to next candidate (2026-03-04 02:29 UTC) - Wire failover chain into
convex/seoContent.tsso generation can continue on provider failure (2026-03-04 02:29 UTC) - Verify with
npx convex codegen,npx tsc -p convex/tsconfig.json --noEmit --pretty false, andnpx tsc -p . --noEmit --pretty false(2026-03-04 02:29 UTC)
Directory sort by verified and category verified counts (PRD: prds/directory-sort-verified-and-category-verified-count.md)
- Add
verifiedsort mode in directory backend query and UI dropdowns (2026-03-03 07:47 UTC) - Add
verifiedCountto category aggregation used by Category Management (2026-03-03 07:47 UTC) - Update admin category row display to include verified counts (2026-03-03 07:47 UTC)
- Verify existing sort modes and verified toggles still work (2026-03-03 07:47 UTC)
- Update docs:
task.md,changelog.md, andfiles.mdafter verification (2026-03-03 07:47 UTC)
Private profile admin messages and admin notes separation (PRD: prds/private-profile-admin-messages-and-admin-notes.md)
- Route profile user messages to admin comments thread in
packageCommentsand keep admin notes inpackageNotesonly (2026-03-03 06:24 UTC) - Remove public comment rendering from
src/pages/Submit.tsxso user admin messages stay private (2026-03-03 06:24 UTC) - Add ownership based message actions (hide, archive, delete) for both profile and admin comment UIs (2026-03-03 06:24 UTC)
- Enforce backend authorization for message lifecycle actions (no client trusted author fields) (2026-03-03 06:24 UTC)
- Update docs:
task.md,changelog.md, andfiles.mdafter verification (2026-03-03 06:24 UTC)
- Implement Connect OAuth PKCE provider and callback handling (2026-03-03 00:22 UTC)
- Bridge Connect tokens into Convex auth client (2026-03-03 00:23 UTC)
- Update Convex JWT provider configuration for Connect issuer/JWKS (2026-03-03 00:23 UTC)
- Verify route access behavior remains unchanged (2026-03-03 00:25 UTC)
- Update task, changelog, and files docs with timestamps (2026-03-03 00:26 UTC)
WorkOS AuthKit migration for components routes (PRD: prds/workos-authkit-migration-components-routes.md)
- Swap frontend auth provider from legacy Convex Auth to WorkOS AuthKit and keep
/components/callbackreturn path behavior (2026-03-02 23:36 UTC) - Replace backend auth helpers and admin checks to use
ctx.auth.getUserIdentity()email claims (2026-03-02 23:37 UTC) - Remove legacy auth schema and HTTP route coupling (
authTables,auth.addHttpRoutes) (2026-03-02 23:37 UTC) - Update dependencies and auth config for WorkOS JWT providers (2026-03-02 23:40 UTC)
- Verify public, auth-gated, and admin routes plus markdown alias route safety (2026-03-02 23:41 UTC)
- Update
task.md,changelog.md, andfiles.mdwith completion timestamps (2026-03-02 23:42 UTC)
- Create runbook PRD with staging and production WorkOS setup for redirects, CORS, and JWT email claim requirements (2026-03-02 22:30 UTC)
- Document exact Convex deployment environment variables for staging and production including required and optional AuthKit auto-provision keys (2026-03-02 22:30 UTC)
- Document frontend environment variables for local and Netlify production along with route verification checklist (2026-03-02 22:30 UTC)
- Update
task.md,changelog.md, andfiles.mdto include this runbook deliverable (2026-03-02 22:30 UTC)
- Add PRD metadata requirements with date and time format in workflow and create-prd skill (2026-03-02 22:18 UTC)
- Add timestamp guidance for task completion logging in task workflow docs (2026-03-02 22:18 UTC)
- Add timestamp guidance for changelog updates in update-project-docs skill and workflow rule (2026-03-02 22:18 UTC)
- Update project docs (
task.md,changelog.md,files.md) to reflect this process update (2026-03-02 22:18 UTC) - Backfill timestamp metadata across existing PRDs in
prds/(2026-03-02 22:24 UTC) - Backfill legacy completed task entries with timestamp format in
task.md(2026-03-02 22:25 UTC) - Normalize legacy date-only changelog bullets to timestamp format in
changelog.md(2026-03-02 22:26 UTC)
- Create PRD for read-only MCP, ComponentDetail UX, and rollback constraints (2026-02-28 12:00 UTC)
- Define exact SubmitForm to MCP public field mapping and strip non-public submitter fields (2026-02-28 12:00 UTC)
- Add per-component MCP profile generation (
src/lib/mcpProfile.ts) (2026-02-28 12:00 UTC) - Build universal prompt composer with deterministic fallback (
src/lib/promptComposer.ts) (2026-02-28 12:00 UTC) - Add MCP HTTP endpoints (
convex/http.ts) (2026-02-28 12:00 UTC) - Add Use with agents and CLI section in ComponentDetail with badges, prompts, and copy actions (2026-02-28 12:00 UTC)
- Add install snippets for CLI and agent apps (2026-02-28 12:00 UTC)
- Add IP-based rate limiting and request logging for MCP endpoints (2026-02-28 12:00 UTC)
- Ship behind feature flags with documented rollback steps (2026-02-28 12:00 UTC)
- Verify route safety: markdown alias, llms.txt, SPA routes all work (2026-02-28 12:00 UTC)
- Update task.md, changelog.md, and files.md (2026-02-28 12:00 UTC)
- Simplified AgentInstallSection UI: single copy prompt, MCP badge in header, removed toggle (2026-03-02 12:00 UTC)
- Moved Use with agents and CLI section above Keywords for SEO/AEO/GEO (2026-03-02 12:00 UTC)
- Added Use with AI anchor link with ClipboardText icon in header navigation (2026-03-02 12:00 UTC)
- Reordered sections: Use with agents and CLI, then Agent Skill (SKILL.md), then Keywords (2026-03-02 12:00 UTC)
Acceptance checks:
- Component detail route works
- Markdown alias resolves via Netlify Edge Function (unchanged)
- llms.txt routes work (per-component and directory-wide) (unchanged)
- Admin/profile/submission routes unchanged
- MCP endpoints return valid JSON responses
- Universal prompt generates with fallback when SEO enrichment missing
- Copy actions work on detail page
Submit page pagination and default page size (PRD: prds/submit-pagination-admin-page-size-setting.md)
- Add paginated submissions queries for list and search in
convex/packages.ts - Add admin and public settings queries for Submit page default page size (20, 40, 60)
- Update
src/pages/Submit.tsxto use paging controls and default page size setting - Add a settings panel in
src/pages/Admin.tsxto change default Submit page size - Verify pagination behavior and update docs (
task.md,changelog.md,files.md)
- Add shared helper for component detail, markdown alias, and llms URLs
- Update
ComponentDetail.tsxdropdown with open markdown and AI-link actions using helper - Add llms link below Keywords in
ComponentDetail.tsx - Update
convex/http.tsmarkdown and llms link emission to use helper - Run build and Convex typecheck verification
AI Provider Settings and Prompt Versioning (PRD: prds/ai-provider-settings-and-prompt-versioning.md)
- Add
aiProviderSettingstable to schema - Add
aiPromptVersionstable to schema - Create
convex/aiSettings.tswith provider and prompt queries/mutations - Update
convex/aiReview.tsto use custom provider settings and prompts - Add
AiProviderSettingsPanelcomponent to Admin.tsx - Add
AiPromptSettingsPanelcomponent to Admin.tsx - Test default behavior unchanged (env vars work)
- Test provider override (Anthropic, OpenAI, Gemini)
- Test prompt versioning and restore
- vercel.json in website can point to repo app
- fix ai check
- docs for badges
- add image builder
- add image builder from https://component-thumbnail-gen.netlify.app/ and https://github.com/waynesutton/component-directory-image-generator
- add incre
- header and footer
- fix font colros a
- npm run typecheck
- add fonts
- add plugin
- prod checklist
- tailwind css form github
- iimport exiting compons
- - [ ] add payments api
-
Refine ComponentDetail security scan sidebar and modal copy (2026-04-02 00:24 UTC)
- Updated
src/pages/ComponentDetail.tsxso the sidebar now uses the neutralSecurity Analyzelabel and shows only scan presence plus date - Removed
safeorunsafestyle status labels from the sidebar and provider rows, added provider site links, and moved the scan date above the provider list in the modal - Kept a modal-only status line using neutral labels:
Confirmed,Not scanned, andAlerts - Hid the header Markdown dropdown while the security modal is open and made the unscanned state open the same modal
- Verified with
ReadLintsonsrc/pages/ComponentDetail.tsx
- Updated
-
Restructure
.claude/skills/to proper directory format and add Convex community skills (2026-03-19 07:15 UTC)- Migrated 6 existing flat skills (
dev.md,gitrules.md,help.md,sec-check.md,workflow.md,write.md) toskill-name/SKILL.mddirectories with YAML frontmatter per Agent Skills spec - Added
real-time-backend/SKILL.mdfromget-convex/real-time-backend-skillfor backend architecture guidance - Added
convex-quickstart/SKILL.mdfromget-convex/agent-skillsfor project scaffolding - Added
convex-setup-auth/SKILL.mdfromget-convex/agent-skillsfor auth provider setup - Added
schema-builder/SKILL.mdfromget-convex/convex-agent-pluginsfor schema design - Added
function-creator/SKILL.mdfromget-convex/convex-agent-pluginsfor function creation - Added
migration-helper/SKILL.mdfromget-convex/convex-agent-pluginsfor safe migrations - Total: 12 skills in standard directory format
- Migrated 6 existing flat skills (
-
align Claude skills with active Cursor rules and add missing security and workflow guidance (
prds/claude-skills-alignment.md) (2026-03-19 06:42 UTC)- Added
.claude/skills/sec-check.mdfor auth, PII exposure, public vs internal query, and verification guidance - Added
.claude/skills/workflow.mdfor PRDs, task tracking, changelog sync, files sync, and subagent usage - Updated
.claude/skills/gitrules.mdso commit creation requires explicit user approval - Updated
.claude/skills/dev.mdto reflect the current PRD and docs workflow rules
- Added
-
polish layout and imported README behavior for submit, profile edit, and detail surfaces (
prds/layout-and-readme-link-polish.md) (2026-03-17 05:43 UTC)- Matched
src/pages/SubmitForm.tsx,src/pages/Profile.tsx, andsrc/pages/ProfileEditSubmission.tsxto themax-w-7xlpage shell used bysrc/pages/Submit.tsx - Made the generated-content textareas in submit and profile edit vertically resizable so users can drag them taller while editing
- Updated
src/components/ReadmePreviewNotice.tsxwith Phosphor toggle icons so the README source helper reads like an expandable control - Upgraded
src/components/CodeBlock.tsxwith a built-in copy button and reused it insrc/components/AgentInstallSection.tsxfor the visible agent prompt block - Fixed imported README relative links in
src/pages/ComponentDetail.tsxso paths likeCONTRIBUTING.mdresolve against the GitHub repository instead of the local app - Verified with
npx tsc --noEmit,ReadLints, andnpm run build
- Matched
-
align detail, submit, admin, and profile editing with the v2 content model (
prds/v2-content-editor-and-profile-edit-page.md) (2026-03-17 05:21 UTC)- Updated
src/pages/ComponentDetail.tsxto moveView llms.txtinto the badge section and switched README source phrasing to read more naturally viaconvex/seoContent.ts - Widened
src/pages/SubmitForm.tsxto1200pxand replaced the flat README preview note with a shared marker-status helper linked to the official component template - Updated
src/components/ComponentDetailsEditor.tsx,src/pages/Admin.tsx, andconvex/seoContentDb.tsso migrated packages edit the v2 generated content model instead of the old AI SEO section - Added routed full-page profile editing in
src/pages/ProfileEditSubmission.tsxandsrc/main.tsx, and updatedsrc/pages/Profile.tsxto use the new page flow at the wider layout - Verified with
npx tsc --noEmit,ReadLints, andnpm run build
- Updated
-
fix migrated README rendering and remove legacy Resources from v2 detail output (
prds/content-model-migration-readme-rendering-fixes.md) (2026-03-17 03:50 UTC)- Fixed
src/components/CodeBlock.tsxto pass Pierre Diffs the expectednamefield instead offilename, which stops README code blocks from crashing during migrated detail-page rendering - Updated
src/pages/ComponentDetail.tsxso legacy SEO sections only render for the old content model and removed the old visible Resources block - Removed obsolete Resources output from the legacy markdown builders in
convex/http.tsandconvex/router.tsso exported markdown stays aligned with the new content model - Verified with
npx tsc --noEmitandReadLints
- Fixed
-
prioritize GitHub README and Convex docs grounding for AI SEO generation (
prds/seo-readme-and-convex-docs-grounding.md) (2026-03-16 23:05 UTC)- Added shared SEO prompt template in
shared/seoPromptTemplate.tsso admin and runtime fallback prompts stay aligned - Updated
convex/seoContent.tsto fetch GitHub README content on demand, support common GitHubblobandtreeREADME paths, and add best effort Convex docs grounding fromhttps://docs.convex.dev/llms.txtplushttps://docs.convex.dev/ - Updated
src/pages/Admin.tsxSEO prompt help text and placeholder list to reflect README first grounding and Convex docs context - Verified with
npm run build
- Added shared SEO prompt template in
-
add admin toggle to hide detail page SEO and SKILL sections (
prds/detail-page-seo-visibility-toggle.md) (2026-03-16 21:37 UTC)- Added
hideSeoAndSkillContentOnDetailPageto package data inconvex/schema.tsand exposed it through the public and admin package shapes inconvex/packages.ts - Updated
updateComponentDetailsso the existing admin editor mutation can toggle the new visibility flag - Added a new
Hide SEOorSEO Hiddentoggle to the Actions row insrc/pages/Admin.tsx - Updated
src/pages/ComponentDetail.tsxto hide generated SEO blocks, SKILL download actions, theFor Agentslink,AgentInstallSection, and theSKILL.mdblock when the flag is enabled - Gated detail-page meta description and FAQ JSON-LD to the same visibility flag so hidden drafts stay out of the public SEO layer
- Verified with
npx convex codegen,npx tsc --noEmit, andnpm run build
- Added
-
fix submit form category dropdown sync with admin-managed categories (
prds/submit-form-category-sync.md) (2026-03-16 17:27 UTC)- Updated
src/pages/SubmitForm.tsxto use categoryidvalues fromuseDirectoryCategories()instead of a non-existentslugfield - Keeps submit-time category selection aligned with
src/components/ComponentDetailsEditor.tsxand the admin category source of truth - Verified with
npm run build
- Updated
-
fix submit success modal button roundness and sync session docs (2026-03-12 17:06 UTC)
- Updated
src/pages/SubmitForm.tsxsoView My SubmissionsandBack to Directoryuserounded-lginstead of pill styling in the success modal - Synced
task.md,changelog.md, andfiles.mdfor this session change - Verified with
npm run build
- Updated
-
fix admin thumbnail generation client error (2026-03-12 17:05 UTC)
- Updated
convex/thumbnailGenerator.tsso the public admin action now verifies access and queues internal worker_generateThumbnailForPackage - Kept image composition on the private worker path to avoid the Convex runtime
Called by clienterror fromComponentDetailsEditor - Updated
src/components/ComponentDetailsEditor.tsxto send only defined action args and showThumbnail generation started - Verified with
npx convex dev --once --typecheck disableandnpm run build
- Updated
-
add component detail help modal (
prds/component-detail-help-modal.md) (2026-03-09 22:22 UTC)- Added a small
How to get helptrigger below the rating block insrc/pages/ComponentDetail.tsx - Added a lightweight help modal with author support guidance, Convex community link, and a muted third party component notice
- Matched the existing overlay, close button, backdrop click, and
Escapebehavior used by other app modals
- Added a small
-
update AI review prompt to v5 with component source detection and split validator criteria (
prds/ai-review-prompt-v5.md) (2026-03-09 21:16 UTC)- Updated
convex/aiReview.tsso repo discovery prefersdefineComponent()configs over consumer apps that only usedefineApp() - Updated the default review prompt in both
convex/aiReview.tsandconvex/aiSettings.tsto v5 with component source discovery guidance and the split args-versus-returns validator criteria - Updated the AI Review Settings help copy in
src/pages/Admin.tsxto match the new 8 critical plus 5 advisory review model - Verified with
npx tsc -p convex/tsconfig.json --noEmit --pretty falseandnpm run build, which matches the Netlify build command innetlify.toml - Added shared prompt metadata in
shared/aiReviewPromptMeta.tssoaiReview.ts,aiSettings.ts, and the Admin prompt UI all show the same review version label and updated date
- Updated
-
fix Tremendous reward custom recipient messages (
prds/tremendous-custom-message-delivery.md) (2026-03-09 20:58 UTC)- Forwarded the optional reward note from
convex/payments.tsinto Tremendousdelivery.meta.messageso recipient emails and landing pages can show custom copy - Kept the existing reward payload shape, payment recording flow, and no-note behavior unchanged by only sending the message when a trimmed note exists
- Updated the Admin reward and test reward modal labels in
src/pages/Admin.tsxto clarify the field is recipient-facing - Verified with
npm run build
- Forwarded the optional reward note from
-
rebalance submit table columns and move published date into expanded submission details (
prds/submit-table-published-column-and-alignment.md) (2026-03-09 08:03 UTC)- Removed the desktop
Publishedcolumn fromsrc/pages/Submit.tsx - Rebalanced the desktop metadata columns so
Maintainer,Downloads,Submitted, andStatususe equal widths - Moved published date visibility into the expanded submission details panel
- Verified with
npm run build
- Removed the desktop
-
harden package write auth and add profile logo upload (
prds/profile-logo-upload-and-package-write-auth.md) (2026-03-09 06:25 UTC)- Hardened package write APIs in
convex/packages.tsso admin-only mutations require admin identity and shared logo writes now require package ownership or admin access - Moved system-only package writes for submit, refresh, and AI review flows onto internal mutations so background jobs still work without exposing unsafe public write paths
submitPackagenow derives submission ownership from the authenticated email before creating a package- Added logo upload, replace, and clear controls to the edit modal in
src/pages/Profile.tsx - Extended
getMySubmissionForEditto returnlogoUrlfor the profile editor - Verified with
npx convex codegenandnpm run build
- Hardened package write APIs in
-
default submit form packages to Community in Admin (
prds/submitted-components-default-community.md) (2026-03-09 05:51 UTC)- Public submissions now create packages with
communitySubmitted: trueinconvex/packages.ts - Existing Admin Actions and
ComponentDetailsEditorstate now load Community as enabled for newly submitted packages without extra UI logic - Verified with
npx convex codegenandnpm run build
- Public submissions now create packages with
-
implement review-state detail page gating (
prds/review-state-detail-page-gating.md) (2026-03-09 01:58 UTC)- Added review-state robots behavior in
src/pages/ComponentDetail.tsxso only approved pages are indexable while pending, in review, changes requested, and rejected staynoindex, nofollow - Gated
For Agents,AgentInstallSection, download skill actions, andSKILL.mdrendering toin_reviewandapproved - Updated
netlify/edge-functions/og-meta.tsso crawler-visible HTML gets the same robots directive as the client without changing badge or markdown route handling - Added small SEO helpers in
src/lib/seo.ts, createdprds/review-state-detail-page-gating.md, confirmed sitemap still points at approved packages only, and verified withnpm run build
- Added review-state robots behavior in
-
Added admin delete controls for older AI review runs (2026-03-08 17:04 UTC)
- Added
deleteAiReviewRunmutation with a backend guard that blocks deletion of the latest saved review snapshot - Updated the AI review history drawer to let admins delete older runs from both the run list and the detail pane with confirmation
- Verified with Convex codegen, Convex TypeScript checks, and production build
- Added
-
Added Escape key close support for AI review history drawer (2026-03-08 17:05 UTC)
- Updated
AiReviewHistoryPanelto close onEscape - Kept delete confirmation flow safe by ignoring drawer close on
Escapewhile the confirm modal is open - Verified with production build
- Updated
-
Added persistent AI review run history and admin review drawer (2026-03-08 06:06 UTC)
- Added
aiReviewRunsstorage so previous AI review runs are preserved instead of being overwritten onpackages - Added admin history query and right-side drawer with run list, score summary, provider metadata, criteria checklist, and raw model output
- Verified with Convex codegen, Convex TypeScript checks, and production build
- Added
-
Unified font sizes between AI generated SEO content and long description markdown in ComponentDetail.tsx (2026-03-05 UTC)
- Replaced
prose prose-smwith explicittext-sm text-text-secondaryselectors - Long description now matches SEO content styling
- Changed "Made by" to "by" in author row
- Replaced
-
Updated "Live Demo URL" label to "Live Demo URL or Example App" in SubmitForm.tsx and ComponentDetailsEditor.tsx (2026-03-05 17:45 UTC)
-
Fixed long package name overflow in ComponentDetail author row (2026-03-05 15:30 UTC)
- Added
flex-wrapto author row so items wrap gracefully instead of overflowing - Added
truncate max-w-[280px] sm:max-w-noneto repo name link (truncates on mobile, full on desktop) - Added
titleattribute for hover tooltip showing full name when truncated
- Added
-
Fixed long description markdown rendering and added submit form mini preview (2026-03-05 23:08 UTC)
ComponentDetail.tsx: long description markdown now preserves line breaks and uses purple links (#8D2676) with hover underlineSubmitForm.tsx: long description now includes safe markdown support guidance and live mini markdown preview- Supports headings, bullet lists, line breaks, and markdown links in author-facing submit flow
-
Implemented MCP Additive Rollout Phase 1 (2026-03-03 18:00 UTC)
- Added MCP protocol endpoint at
/api/mcp/protocolwith JSON-RPC 2.0 interface - Implemented
initialize,tools/list, andtools/callmethods - Added 5 tools:
search_components,get_component,get_install_command,get_docs,list_categories - Added Cursor install link endpoints:
/api/mcp/cursor-install(global) and/api/mcp/cursor-install-component(per-component) - Updated
AgentInstallSectionwith Cursor install button and config copy - Added MCP capability sections to
/api/llms.txtand/api/markdown-index - All endpoints log to
mcpApiLogstable with tool, slug, query, and timing data - Preserved all existing routes and UI unchanged
- PRD:
prds/mcp-additive-rollout-phase1.md
- Added MCP protocol endpoint at
-
Added runtime AI provider failover across admin settings and environment vars (2026-03-04 02:29 UTC)
- Added
convex/aiProviderFallback.tsfor candidate chain building and sequential fallback execution - Added
_getProviderSettingsForFallbackinternal query inconvex/aiSettings.ts - Updated
convex/aiReview.tsandconvex/seoContent.tsto try active admin, backup admin, then env providers on runtime failures - Regenerated Convex bindings (
convex/_generated/api.d.ts) vianpx convex codegen - Verified via Convex codegen and TypeScript checks
- Added
-
Fixed TypeScript errors in AgentInstallSection.tsx (2026-03-03 09:30 UTC)
- Removed undefined
PromptComponentDatatype reference - Made
npmUrl,version,description,weeklyDownloadsrequired in local interface - Build verified passing (tsc and npm run build)
- Removed undefined
-
Synced Status Legend, Visibility Guide, and Badges across Profile.tsx, Submit.tsx, and Admin.tsx (2026-03-03 09:15 UTC)
- Profile.tsx: removed Archived and Pending Deletion from Visibility Guide
- Profile.tsx: added Featured status, updated rejected icon to Prohibit for consistency
- Profile.tsx: removed DeletionBadge component and markedForDeletion SubmissionCard props
- Profile.tsx and Submit.tsx: added Badges section (Convex Verified, Community)
- Verified all three pages share identical status definitions and styling
- Build verified passing (tsc and npm run build)
-
Rebuilt Footer.tsx to match official Convex.dev footer design (2026-03-03 08:25 UTC)
- Dark background (
#141414) with Convex design system tokens - White Convex wordmark logo, 4 link columns (Product, Developers, Company, Social)
- Social icons from
/public/*.svg, external links withExternalLinkIcon - "A Trusted Solution" section with green checkmark badges (SOC 2, HIPAA, GDPR)
- Responsive grid layout, dynamic copyright year
- Fixed asset paths for Vite base URL (
/components/prefix) - Original footer saved as
FooterBackup.tsx
- Dark background (
-
Updated Directory sort label text from "Verified first" to "Verified" and revalidated production build (2026-03-03 07:52 UTC)
- Updated desktop and mobile sort display labels in
src/pages/Directory.tsx - Confirmed
npm run buildpasses for Netlify style output
- Updated desktop and mobile sort display labels in
-
Added Related Components section to component detail pages (2026-03-03 07:29 UTC)
- New
getRelatedComponentsquery scoring by category, tags, and downloads - Compact no-thumbnail cards (max 3) below View llms.txt with border divider
- New
showRelatedOnDetailPageadmin setting with toggle in AI Review Settings panel (on by default) - Updated
getAdminSettingsandupdateAdminSettingto support new key - Updated
files.md,changelog.md, andtask.md - Build verified passing
- New
-
Added Component Authoring Challenge banner to Directory page (2026-03-03 07:15 UTC)
- Created
src/components/ChallengeBanner.tsxwith dark background, grid texture, and pink bordered CTA button - Uses inline SVG data URL based on
public/banner-grid.svgwith boosted stroke visibility for dark backgrounds - Placed above FAQSection in
src/pages/Directory.tsx - Updated
files.md,changelog.md, andtask.md - Build verified passing
- Created
-
Fixed Convex return validator mismatch for private message thread payloads (2026-03-03 06:44 UTC)
- Updated
getPackageCommentsreturn validator inconvex/packages.tsto include optionalstatusUpdatedAt - Resolved runtime
ReturnsValidationErrorcaused by archived or hidden message records - Verified with local build and Convex function validation
- Updated
-
Updated Directory badge placement for community-only component cards (2026-03-03 06:32 UTC)
- Adjusted
src/components/ComponentCard.tsxso Community-only listings render in the same right-side badge slot as Verified - Preserved dual-badge order when both badges are present (Community then Verified)
- Verified with production build
- Adjusted
-
Added hidden or archived message toggle and restore controls in Profile and Admin message modals (2026-03-03 06:32 UTC)
- Added
Show hidden or archivedtoggle in both modals - Added
Restoreaction for owned hidden and archived messages - Updated backend message queries to support optional
includeInactive - Confirmed admin own notes deletion remains enforced in backend and UI
- Added
-
Fixed private message routing and ownership controls between Profile and Admin (2026-03-03 06:24 UTC)
- Profile requests now write to private
packageCommentsmessage thread - Admin
Commentspanel now represents private submitter/admin messages, not public frontend comments Submit.tsxno longer renders package comments publicly- Added message lifecycle controls for authored messages: hide, archive, delete
- Enforced backend authorization for note/comment ownership operations
- Profile requests now write to private
-
Published team handoff guide for WorkOS Connect with Convex and Netlify (2026-03-03 01:28 UTC)
- Updated
prds/workos-convex-environment-runbook.mdwith final working configuration and explicit route policy - Added
prds/workos-connect-convex-netlify-how-to.mdwith development, staging, and production setup sections - Included route matrix for public, authenticated, admin, and non app alias routes
- Excluded secrets and used placeholders for safe sharing in Notion
- Updated
-
Added Community badge toggle to Admin Actions row (2026-03-03)
- Added
communitySubmittedprop toInlineActionscomponent - Added
handleToggleCommunityhandler callingupdateComponentDetailsmutation - Added Community toggle button with
Usersicon and Community badge color scheme - Button positioned next to Convex Verified toggle in Actions row
- Passed
communitySubmittedprop through toInlineActionsfrom package data - Build verified passing
- Added
-
Finalized Connect environment variable guidance after admin doc cross-check (2026-03-03 01:12 UTC)
- Confirmed this app uses WorkOS Connect OAuth client credentials with AuthKit domain based OAuth endpoints
- Validated local
.env.localrequiresVITE_WORKOS_CLIENT_ID,VITE_WORKOS_REDIRECT_URI, andVITE_WORKOS_AUTHKIT_DOMAIN - Confirmed Convex dev and prod require
WORKOS_CLIENT_IDandWORKOS_AUTHKIT_DOMAIN - Updated session docs to reflect Connect domain requirements in runbook and migration PRD
-
Switched app auth flow to WorkOS Connect OAuth with PKCE and Convex token bridge (2026-03-03 00:26 UTC)
- Added
src/lib/connectAuth.tsxprovider and hook for OAuth authorize, callback exchange, token storage, and sign out - Updated
src/main.tsxto useConnectAuthProvider+ConvexProviderWithAuthKitwith custom connect hook - Updated
src/lib/auth.tsxto use connectsignIn/signOutwhile keepinguseConvexAuthauth state - Updated
convex/auth.config.tsto validate JWT withWORKOS_AUTHKIT_DOMAINissuer and/oauth2/jwks - Updated
.env.localexample and runbook withVITE_WORKOS_AUTHKIT_DOMAINandWORKOS_AUTHKIT_DOMAIN - Removed direct
@workos-inc/authkit-reactdependency - Verification:
tsc -p convex,tsc -p ., andnpm run buildpassed
- Added
-
Migrated auth wiring from legacy Convex Auth to WorkOS AuthKit across frontend and Convex backend (2026-03-02 23:42 UTC)
- Updated
src/main.tsxprovider stack toAuthKitProvider+ConvexProviderWithAuthKit - Updated
src/lib/auth.tsxto use WorkOSsignInandsignOut - Reworked
convex/auth.tsadmin and user checks to usectx.auth.getUserIdentity() - Updated
convex/auth.config.tsto WorkOS dual JWT providers withWORKOS_CLIENT_ID - Removed legacy auth coupling from
convex/http.tsandconvex/schema.ts - Updated
convex/packages.tsownership email resolution to identity claims - Verified with
npm run lint
- Updated
-
Added Community badge feature for community-submitted components (2026-03-02 12:00 UTC)
- New
communitySubmittedfield on packages schema - Created
CommunityBadgecomponent with#E9DDC2background color - Badge appears between downloads and Verified on Directory cards
- Badge appears below Verified and above downloads in ComponentDetail sidebar
- Admin checkbox in ComponentDetailsEditor for toggling Community status
- Updated all validators and helper functions (
directoryCardValidator,publicPackageValidator,adminPackageValidator,toPublicPackage,toAdminPackage) - Updated queries (
listApprovedComponents,getFeaturedComponents) and mutation (updateComponentDetails) - Passed through Admin.tsx
PackageComponentDetailsEditorwrapper - Build verified passing
- New
-
Fixed
View llms.txtvisibility when keywords are missing (2026-02-27 12:00 UTC)- Moved llms link out of the Keywords conditional in
src/pages/ComponentDetail.tsx - Link now renders whenever component links are available, regardless of tags
- Verified with
npx tsc -p . --noEmit --pretty false
- Moved llms link out of the Keywords conditional in
-
Synced session docs for pagination and markdown link updates (2026-02-27 12:00 UTC)
- Updated
files.mdwith Submit pagination APIs and admin setting query coverage - Updated PRD index in
files.mdwith session PRDs - Updated
changelog.mdunreleased notes to reflect completed session documentation
- Updated
-
Updated Netlify markdown alias PRD with centralized helper and local fallback notes (2026-02-27 12:00 UTC)
- Documented why alias URLs are production-only and why localhost must use Convex API endpoints
- Added guidance for shared URL helper usage to prevent route drift across frontend and Convex HTTP output
- Captured verification matrix for local and production link behavior
-
Fixed localhost markdown and llms dropdown links after URL centralization (2026-02-27 12:00 UTC)
- Added client-aware URL strategy in
shared/componentUrls.ts - Localhost now resolves markdown and llms links to Convex HTTP endpoints
- Netlify production remains on alias URLs backed by edge function and redirects
- Verified with
npx tsc -p . --noEmit,npx tsc -p convex/tsconfig.json --noEmit, andnpm run build
- Added client-aware URL strategy in
-
Added Submit page pagination with admin default page size control (2026-02-27 12:00 UTC)
- Added paginated public queries in
convex/packages.tsfor Submit list and search views - Added admin and public setting queries plus admin mutation for Submit default page size (
20,40,60) - Updated
src/pages/Submit.tsxto load paged results with Previous and Next controls - Updated
src/pages/Admin.tsxwith a new Settings panel to configure Submit default page size - Verified with
npx tsc -p convex -noEmit --pretty falseandnpx tsc -p . -noEmit --pretty false
- Added paginated public queries in
-
Centralized component markdown and llms URL generation (2026-02-27 12:00 UTC)
- Added shared helper at
shared/componentUrls.tsfor detail, markdown alias, and llms URL construction - Updated
src/pages/ComponentDetail.tsxdropdown withOpen markdown file,Open in ChatGPT,Open in Claude, andOpen in Perplexity - Added
View llms.txtlink below Keywords on component detail page - Updated
convex/http.tsto use centralized URL generation in/api/markdown-indexand/api/component-llms - Verified with
npm run build,npx tsc -p convex/tsconfig.json --noEmit, andnpx tsc -p . --noEmit
- Added shared helper at
-
Kept markdown alias URL on Netlify domain (2026-02-27 12:00 UTC)
- Added Netlify Edge Function mapping for
/components/*/*.md - Added
netlify/edge-functions/component-markdown.tsto resolve markdown by slug - Removed client-side redirect for markdown alias from router
- Alias now serves markdown without switching browser URL to Convex domain
- Added Netlify Edge Function mapping for
-
Added markdown alias URL support for component slugs (2026-02-27 12:00 UTC)
- Added route handling for
/components/<slug>/<slug>.md - Client router now redirects alias URL to Convex markdown endpoint
- Keeps SPA/admin routes stable while providing markdown access path
- Added route handling for
-
Fixed Netlify SPA routing and GitHub avatar URLs (2026-02-27 12:00 UTC)
- Fixed routes like
/components/submissions/adminreturning 404 markdown - Replaced greedy named-parameter redirect rules with explicit splat suffix rules:
/components/*.mdfor markdown/components/*/llms.txtfor per-component llms
- Changed avatar URL format to
https://avatars.githubusercontent.com/{username}(more reliable CDN) - Added
migrateAvatarUrlsadmin mutation to fix existing database records - Main
/components/llms.txtand/components.mdstill work
- Fixed routes like
-
Created Tremendous Rewards Integration PRD (2026-02-27 12:00 UTC)
- Full PRD at
prds/tremendous-rewards-integration.md - Documents Tremendous API setup, SDK usage, and environment variables
- Defines new
paymentstable schema and package reward fields - Specifies Send Reward button placement in Admin Actions row
- Includes PaymentBadge, RewardSettingsPanel, and auto-send feature specs
- Links to official Tremendous docs: API reference, Node SDK, sandbox testing
- Ready for implementation
- Full PRD at
-
Applied Convex return validator best practices to internal functions (2026-02-26 12:00 UTC)
- Removed redundant
returns: v.null()from 5 internal mutations (_saveSeoContent,_updateSeoStatus,_setSeoError,_updateThumbnailJob,_saveGeneratedThumbnail) - Removed
returns: v.union(v.null(), v.any())from 2 internal queries (_getPackage,_getPackageByName) - Fixed
ctx.db.patchAPI bugs inseoContentDb.ts(was incorrectly passing table name as first argument) - Fixed
ctx.db.getAPI bug inpackages.ts(was incorrectly passing table name before ID) - Added
.cursor/skills/convex-return-validators/SKILL.mdfor future reference - No behavioral changes; TypeScript inference handles return types for internal functions
- Removed redundant
-
AI Review Results panel collapsed by default in Admin dashboard (2026-02-26 12:00 UTC)
- Entire panel now collapsed by default, showing only status icon, label, and date
- Single toggle expands/collapses all content (summary, error, and criteria)
- Removed nested toggle (previously had outer panel + inner criteria toggle)
- Copy button accessible on collapsed header row via stopPropagation
- Reduces vertical space in admin package rows
-
Removed user visibility controls from Profile page (2026-02-26 12:00 UTC)
- Removed Hide, Show, Delete, and Cancel Deletion buttons from user profile
- Users must contact admin via "Send Request" to manage component visibility
- Removed
ConfirmModalcomponent (no longer needed) - Removed
setVisibility,deleteSubmission,cancelDeleteSubmissionmutations from Profile - Removed
onHide,onShow,onDelete,onCancelDeleteprops from SubmissionCard - Removed
ArrowCounterClockwiseicon import - Updated deletion message to guide users to contact admin
- Admin retains full control via Admin dashboard
- Build verified passing
-
Added Download Skill button for SKILL.md files (2026-02-25 12:00 UTC)
- Download button with Phosphor FileArrowDown icon next to Markdown dropdown in author row
- Button only appears when SKILL.md has been generated (after SEO content generation runs)
- SKILL.md section now has both copy and download buttons
- Downloads as
SKILL.mdfile for easy saving to project - Uses browser Blob API for client-side file generation
-
Directory sidebar sticky position adjusted (2026-02-25 12:00 UTC)
- Changed sticky top from
top-6totop-20(80px from viewport top) - Submit button now remains visible below the header when scrolling
- Entire sidebar (Submit, Search, Sort, Categories) stays sticky together
- Changed sticky top from
-
SEO Prompt Versioning and Multi-Provider AI support (2026-02-25 12:00 UTC)
- Added
seoPromptVersionstable to schema for SEO prompt version history - Added SEO prompt queries/mutations to
convex/aiSettings.ts:getSeoDefaultPrompt,getSeoActivePrompt,getSeoPromptVersions,saveSeoPromptVersion,activateSeoPromptVersion,resetSeoToDefaultPrompt - Added
DEFAULT_SEO_PROMPTconstant with placeholder substitution (e.g.,{{displayName}},{{packageName}}) - Updated
convex/seoContent.tsto use custom prompt from database and support multi-provider (Anthropic, OpenAI, Gemini) - Added
callAiProviderhelper function for unified API calls across providers - Added
SeoPromptSettingsPanelcomponent to Admin Settings view - Panel includes: edit mode, version history, notes, restore, reset to default
- Moved Refresh npm data and Generate Slug buttons from package card row to InlineActions Actions row
- Removed standalone
RefreshNpmButtonandGenerateSlugButtoncomponents - Auto-refresh settings verified to update all package metadata fields (File Count, Weekly Downloads, etc.)
- Multi-provider AI support works for ALL AI features (AI Review + SEO Content): both use same admin provider settings or env var fallback
- Added confirmation modal for "Clear (use env)" buttons with danger styling and warning message
- Added
-
Added Actions row to Admin InlineActions panel (2026-02-25 12:00 UTC)
- New "Actions" row above Status and Visibility rows in expanded package view
- Convex Verified toggle button (teal, shows fill when verified)
- Regenerate SEO + Skill button (shows spinner during generation, green when completed)
- Combined Auto-fill button (fills author from GitHub and description from npm in parallel)
- Hide Thumbnail toggle (orange, only shows when thumbnail exists, hides in category but shows in Featured)
- Auto-fill shows what was filled in success toast
- All buttons match existing Admin theme with Phosphor icons
- Added useEffect hooks for author/avatar/verified field sync in ComponentDetailsEditor
- PRD:
prds/admin-actions-row.md
-
Added hide from submissions page feature for admin control (2026-02-25 12:00 UTC)
- New
hideFromSubmissionsfield on packages schema toggleHideFromSubmissionsmutation to toggle visibility on Submit.tsxlistPackagesandsearchPackagesfilter out hidden packages- Toggle button in Admin.tsx package row labeled "Sub Hide" / "Sub Hidden" to differentiate from directory Hide
- Hidden packages still appear in Directory if approved
- Admin panel shows all packages regardless of this setting
- PRD:
prds/hide-from-submissions.md
- New
-
Added featured components sort order for admin control (2026-02-25 12:00 UTC)
- New
featuredSortOrderfield on packages schema getFeaturedComponentsquery sorts byfeaturedSortOrder(nulls last), then newest firstsetFeaturedSortOrdermutation for admin to set order value- Sort order input in Admin.tsx next to Featured toggle (only shown when featured)
- Dropdown sort (downloads, newest, etc.) does NOT affect Featured section order
- PRD:
prds/featured-sort-order.md
- New
-
Added hide thumbnail in category option for components (2026-02-25 12:00 UTC)
- New
hideThumbnailInCategoryfield on packages schema - Checkbox in Admin Component Details editor (visible when thumbnail exists)
- Thumbnails always shown in Featured section
- Thumbnails hidden in category listings when checkbox is checked
- Fixed: Added field to
directoryCardValidatorand query return maps (listApprovedComponents,getFeaturedComponents) - Updated
ComponentCardwithshowThumbnailprop override - PRD:
prds/hide-thumbnail-in-category.md
- New
-
Imported 41 official Convex components to production database (2026-02-24 12:00 UTC)
- Created
seedOfficialComponentsinternal action withimportAsPendinganddryRunflags - Added
browser-usecomponent (AI category) and synced with convex.dev/components source - Renamed
_upsertSeededComponentto_upsertOfficialComponentwith improved logic - Preserves existing
reviewStatuson updates, only sets new status on inserts - Returns detailed stats: total, created, updated, failed, dryRun, wouldImport
- Legacy
seedExistingComponentsalias preserved for backward compatibility - Production import: 27 created as pending, 14 updated, 0 failed
- Run:
npx convex run --prod seed:seedOfficialComponents '{"importAsPending": true}'
- Created
-
Added pagination with configurable items per page to Admin panel (2026-02-24 12:00 UTC)
- Package list now shows 20 items per page by default
- Page navigation with Previous/Next buttons and numbered page buttons
- Items per page dropdown (5, 10, 20, 40, 100) next to sort dropdown
- Each filter tab (All, Pending, Review, Approved, Changes, Rejected, Deletion, Archived) maintains its own page state
- "Showing X-Y of Z" counter updates based on current page and items per page
- Page resets to 1 when changing filter or items per page
-
Reordered icons in Admin package rows (2026-02-24 12:00 UTC)
- Moved ComponentDetailQuickLink (external link icon) to be last in the badge group
- Order is now: StatusBadge, VisibilityBadge, UnrepliedNotesIndicator, ComponentDetailQuickLink
- Icon remains before the downloads/date section on the far right
-
Added LLMs.txt and Markdown clean URL support (2026-02-24 12:00 UTC)
- New
/api/markdown-indexendpoint for directory-wide markdown - New
/api/component-llmsendpoint for per-component llms.txt - Added 6 Netlify redirects for clean URLs:
/components/llms.txt,/components.md,/components/:slug/llms.txt,/components/:slug.md, plus scoped package variants - All endpoints tested and working via Convex site URL
- New
-
Moved Keywords section below Agent Skill (SKILL.md) section on ComponentDetail.tsx (2026-02-24 12:00 UTC)
- Keywords tags now appear after the SKILL.md copyable snippet
- Improves page hierarchy: SEO content > SKILL.md > Keywords
-
Moved Markdown dropdown to author row on ComponentDetail.tsx (2026-02-24 12:00 UTC)
- Dropdown relocated from sidebar to main content area (author row)
- Appears after author info with separator
- Same functionality: View as Markdown, Copy as Markdown, Copy page URL
-
Commented out GitHub Issues feature on ComponentDetail.tsx (2026-02-24 12:00 UTC)
- Issues badge button in author row commented out
- Full issues panel (open/closed tabs, issue list, pagination) commented out
- Code preserved for future re-enabling
-
Added clear logo button in Component Details editor (2026-02-24 12:00 UTC)
- Clear button next to download button when logo exists
- New
clearLogomutation inconvex/packages.tsto remove logo URL and storage reference - Added
clearingLogostate andhandleClearLogohandler inComponentDetailsEditor.tsx - Matches existing thumbnail clear functionality
-
Fixed SubmitForm.tsx success modal button layout (2026-02-23 12:00 UTC)
- Buttons now display horizontally with
flex-rowinstead of stacked - Improved spacing with
gap-3andinline-flexfor alignment - Changed font weight to medium and text color to primary for outline button
- Buttons now display horizontally with
-
Fixed SubmitForm.tsx tags validator mismatch (2026-02-23 12:00 UTC)
- Backend
submitPackageexpectstags: v.optional(v.string())(comma-separated string) - SubmitForm.tsx was incorrectly sending tags as an array
- Changed to
tags.trim() || undefinedto match the validator - Fixes "ArgumentValidationError: Value does not match validator" on live site submissions
- Backend
-
Enhanced SEO support for ComponentDetail pages (2026-02-24 12:00 UTC)
- Added Twitter Card meta tags (summary_large_image with thumbnail)
- Added canonical URL tag for duplicate content prevention
- Added og:site_name and og:image:alt tags for better sharing
- New
setComponentSeoTags()consolidated helper in seo.ts - New
setTwitterTags()andsetCanonicalUrl()functions - Fixed index.html Twitter meta tags (changed
propertytoname) - Updated index.html URLs to production domain (www.convex.dev/components)
-
AI Provider Settings and Prompt Versioning feature (2026-02-23 12:00 UTC)
- Added
aiProviderSettingsandaiPromptVersionstables to schema - Created
convex/aiSettings.tswith provider and prompt management functions - Updated
convex/aiReview.tsto support Anthropic, OpenAI, and Google Gemini - Added
AiProviderSettingsPanelin Admin Settings (API key, model, docs links) - Added
AiPromptSettingsPanelin Admin Settings (edit, version history, restore) - Environment variables still work as default fallback
- PRD:
prds/ai-provider-settings-and-prompt-versioning.md
- Added
-
Commented out badge section on ComponentDetail.tsx until endpoint is working (2026-02-23 12:00 UTC)
- "Add badge to your README" UI section hidden
- Badge markdown line in buildMarkdownDoc function also commented out
- Ready to re-enable when badge feature is implemented
-
Added auto-fill description button in Component Details editor (2026-02-23 12:00 UTC)
- "Auto-fill from Package" button next to Long Description field
- Copies npm/repo description from Package Metadata into Long Description
- Admin can then edit the description before saving
- Updated
ComponentDetailsEditor.tsxwith newnpmDescriptionprop - Updated
PackageComponentDetailsEditorin Admin.tsx to passpkg.description
-
Fixed production legacy GitHub OAuth "Missing sign-in verifier" error (2026-02-23 12:00 UTC)
- Updated the legacy auth package to resolve verifier handling
- Configured GitHub OAuth callback URL:
https://giant-grouse-674.convex.site/api/auth/callback/github - Generated production JWT keys with the legacy auth CLI
- Set
SITE_URLtohttps://components-directory.netlify.app/components - Created
prds/authfix-2026-02-23.mddocumenting the fix
-
Added router redirect for paths without
/componentsprefix (2026-02-23 12:00 UTC)/dodonow redirects to/components/dodo- Ensures consistent URL structure across local and production
- Updated
prds/routes-components-fix.mdwith new redirect behavior
-
Moved FAQSection from Submit.tsx to Directory.tsx (2026-02-23 12:00 UTC)
- FAQ now displays below component cards on the main directory page
- Removed from submissions page
- Updated heading font to
font-semiboldto match "Components" section heading
-
Expanded FAQSection to 8 questions (2026-02-23 12:00 UTC)
- Added: sandboxing, what projects should use, pricing
- Updated "Can I build my own?" with fuller text
- Updated "What happens after I submit?" with authoring guidelines link
- Updated
prds/faq-questions.mdto match
-
Added site footer with Convex links (2026-02-23 12:00 UTC)
- Created
src/components/Footer.tsxcomponent - Convex wordmark logo (40px height) on the left linking to convex.dev
- GitHub repo and Discord links on the right
- 50px top padding above footer
- Responsive layout for mobile/desktop
- Integrated into global layout in
src/main.tsx
- Created
-
Fixed user email not appearing in profile/submissions after legacy GitHub OAuth (2026-02-23 12:00 UTC)
- Legacy auth stored user data in database rather than JWT claims
- Added legacy user id lookup helper to fetch user email from database
- Updated
loggedInUserandisAdminqueries to use database lookup - Updated
requireAdminIdentityandgetAdminIdentityhelpers - Added
getCurrentUserEmailhelper in packages.ts - Updated all queries/mutations that used
ctx.auth.getUserIdentity()for email - Submissions now correctly match by email from the users table
-
Verified GitHub OAuth sign-in flow works end to end (2026-02-23 12:00 UTC)
-
Verified admin access for
wayne@convex.devat/components/submissions/admin(2026-02-23 12:00 UTC) -
Set
SITE_URLtohttp://localhost:5173/componentsfor correct OAuth redirect (2026-02-23 12:00 UTC) -
Migrated authentication from an older auth provider to a prior legacy GitHub auth stack (2026-02-23 12:00 UTC)
- Replaced the previous auth integration with a GitHub OAuth based stack
- Updated
convex/auth.tsto use provider based OAuth wiring - Created
convex/auth.config.tsfor JWT provider configuration - Deleted
convex/convex.config.ts(not needed for that legacy auth stack) - Deleted
convex/auth/session.ts(legacy compatibility cleanup) - Updated
convex/http.tsto useauth.addHttpRoutes(http) - Updated
convex/schema.tsto include legacy auth tables - Updated
src/main.tsxwith legacy auth provider wiring - Updated
src/lib/auth.tsxwith legacy auth action hooks anduseConvexAuth - Added redirect logic in Router for paths not starting with
/components - Generated and set legacy JWT signing environment variables in Convex Dashboard
- Restored
as anytype casts inconvex/crons.tsandconvex/http.tsfor type inference issues - Cleared Vite dependency cache (
node_modules/.vite) to fix 504 Outdated Optimize Dep error - Added
josedev dependency for JWT key generation
-
Migrated from Convex self-hosting to Netlify (2026-02-23 12:00 UTC)
- Removed
@convex-dev/self-hostingdependency - Simplified
convex/convex.config.ts(no components) - Removed
registerStaticRoutes()fromconvex/http.ts - Deleted
.env.production(use Netlify Dashboard env vars) - Changed
vite.config.tstobase: "/"for asset serving - Updated
netlify.tomlwith proper SPA routing redirects - Production URL:
https://components-directory.netlify.app - WorkOS callback:
https://components-directory.netlify.app/components/callback
- Removed
-
SKILL.md generation for AI agent integration (2026-02-23 12:00 UTC)
- AI SEO content generation now also generates SKILL.md content
- SKILL.md follows Agent Skills specification with YAML frontmatter and Markdown body
- Includes component description, installation, usage patterns, key features, API reference
- Copyable SKILL.md snippet on ComponentDetail.tsx (above badge section)
- "SKILL.md generated" status indicator in admin ComponentDetailsEditor
- Button text updated to "Generate SEO + Skill" / "Regenerate SEO + Skill"
- Added
skillMdfield to packages schema - Added
buildSkillMd()helper inconvex/seoContent.ts - Updated
_saveSeoContentinconvex/seoContentDb.tsto persist skillMd - Updated
publicPackageValidatorandtoPublicPackage()inconvex/packages.ts - Updated ComponentDetail.tsx with copy button and pre-formatted display
- Updated ComponentDetailsEditor.tsx with skillMd prop and status display
- Updated Admin.tsx to pass skillMd prop to editor
-
Configured Netlify SPA routing for /components/* (2026-02-23 12:00 UTC)
- Router in
src/main.tsxstrips/componentsprefix for route matching netlify.tomlredirects/to/components(301)netlify.tomlredirects/componentsand/components/*to/index.html(200)- Netlify env vars required:
VITE_CONVEX_URL,VITE_WORKOS_CLIENT_ID,VITE_WORKOS_REDIRECT_URI
- Router in
-
Slug Migration Tool for admin dashboard (2026-02-23 12:00 UTC)
- Added
SlugMigrationPanelcomponent to Admin Settings tab - Displays count and list of packages missing URL slugs
- "Generate All Slugs" button for bulk slug generation
- Individual "Generate" button per package in the migration panel
- Added
GenerateSlugButtoncomponent to package cards (orange, next to npm/repo/demo/refresh) - Button only shows when package has no slug, disappears after generation
- New backend functions:
getPackagesWithoutSlugs,generateSlugForPackage,generateMissingSlugs - Added
LinkSimpleicon import from phosphor-icons
- Added
-
Fixed ComponentDetailsEditor reactive slug sync (2026-02-23 12:00 UTC)
- Added
useEffecthook to sync local slug state wheninitialSlugprop changes from backend - Slug now appears immediately after clicking "Generate Slug" without needing page refresh
- Matches existing reactive behavior for thumbnail, logo, and template fields
- Added
-
Soft deletion workflow for components (2026-02-23 12:00 UTC)
- Users mark components for deletion instead of immediate delete
- Components marked for deletion are hidden from directory immediately
- "Pending Deletion" badge shown on marked components in Profile
- Users can cancel deletion request via "Cancel Deletion" button
- Added schema fields:
markedForDeletion,markedForDeletionAt,markedForDeletionBy - Added
by_marked_for_deletionindex on packages table - Updated
requestDeleteMySubmissionto mark for deletion instead of delete - Added
cancelDeleteMySubmissionmutation for users to undo deletion - Added
_permanentlyDeletePackageinternal mutation - Updated public queries to exclude marked-for-deletion packages
-
Account deletion requires deleting all components first (2026-02-23 12:00 UTC)
- Delete Account modal shows warning if user has active submissions
- User must delete all components before deleting their account
deleteMyAccountmutation now throws error if active submissions exist- Updated Account section and modal text to explain new flow
-
Admin Deletion Management panel in Settings (2026-02-23 12:00 UTC)
- Added
DeletionManagementPanelcomponent to Admin.tsx Settings tab - Toggle for auto-delete marked packages (
autoDeleteMarkedPackagessetting) - Configurable waiting period (1, 3, 7, 14, or 30 days)
- List of packages pending deletion with "Delete Now" button
- Added
adminPermanentlyDeletePackagemutation for admin manual deletion - Added
getPackagesMarkedForDeletionquery - Added
getDeletionCleanupSettingsquery - Added
updateDeletionCleanupSettingmutation
- Added
-
Admin "Marked for Deletion" filter tab (2026-02-23 12:00 UTC)
- Added "Deletion" tab to Admin filter bar with Clock icon
- Tab shows count of packages marked for deletion
- Filter displays only packages with
markedForDeletion: true - Package rows show red "Deletion" badge next to visibility badge when marked
- Updated
VisibilityBadgecomponent to acceptmarkedForDeletionprop
-
Updated Profile.tsx deletion badge display (2026-02-23 12:00 UTC)
- "Pending Deletion" badge now shown next to status and visibility badges
- Badges no longer conditionally hidden when marked for deletion
-
Scheduled deletion cleanup cron job (2026-02-23 12:00 UTC)
- Added
cleanup-marked-for-deletioncron job inconvex/crons.ts - Runs daily at 2 AM UTC
- Deletes packages past the configurable waiting period
- Gated by
autoDeleteMarkedPackagesadmin setting - Added
scheduledDeletionCleanupinternal mutation
- Added
-
Header floating pill redesign (2026-02-23 12:00 UTC)
- Floating pill design with
rounded-full, white/95 background, backdrop blur, and shadow - Convex wordmark black SVG logo (70px height)
- Added GitHub, Discord, and Docs icons to right side of header
- Navigation links (Directory, Submissions, Submit) with medium font weight
- Removed user email from profile dropdown
- Header height: 3.438rem
- Mobile menu fixed: separate dropdown card below header pill (rounded-2xl)
- Floating pill design with
-
SubmitForm.tsx layout improvements (2026-02-23 12:00 UTC)
- Removed "Back to Directory" breadcrumb link
- Moved "Submit a Component" title above the form box to match Profile.tsx style
- Description text remains inside the form box
-
FAQSection component extraction and expansion (2026-02-22 12:00 UTC)
- Extracted FAQ section from SubmitForm.tsx into reusable
src/components/FAQSection.tsx - Added FAQSection to bottom of Submit.tsx (submissions directory page)
- Expanded FAQ content with new questions:
- How are components sandboxed?
- Can I build my own?
- Do components cost money to use?
- Updated review process answer to mention rolling basis review
- Updated requirements answer to remove demo requirement
- Extracted FAQ section from SubmitForm.tsx into reusable
-
Page layout alignment (2026-02-22 12:00 UTC)
- Submit.tsx page width now matches Directory.tsx (
max-w-7xl mx-auto px-4 sm:px-6 lg:px-8) - SubmitForm.tsx page width now matches Profile.tsx (
max-w-3xl) - Submit.tsx title "Components Submissions Directory" styled to match Directory.tsx
- Search input background changed to white on Submit.tsx
- Submit.tsx page width now matches Directory.tsx (
-
Convex self-hosting integration (2026-02-22 12:00 UTC)
- Installed
@convex-dev/self-hostingfor static file serving atgiant-grouse-674.convex.site - Created
convex/convex.config.tsto register the self-hosting component - Created
convex/staticHosting.tsto expose upload APIs for the CLI - Updated
convex/http.tswithregisterStaticRoutes()(preserves existing API routes) - Updated
vite.config.tswith environment-aware base path (SELF_HOST=trueuses/) - Added
deployscript:SELF_HOST=true npx @convex-dev/self-hosting deploy - Added
deploy:staticscript:SELF_HOST=true npx @convex-dev/self-hosting upload --build --prod - Updated
files.mdwith new files and modified descriptions - WorkOS production setup: Add
https://giant-grouse-674.convex.site/callbackto WorkOS dashboard - Convex production setup: Set
WORKOS_CLIENT_IDenv var in Convex dashboard
- Installed
-
Auto sign-in redirect for
/submitpage (2026-02-22 12:00 UTC)- Unauthenticated users visiting
/submitnow auto-redirect to WorkOS sign-in useEffecthook inSubmitForm.tsxtriggerssignIn()automatically when not authenticated- Stores current path in localStorage before redirect
AuthCallbackreads stored path and returns user to/submitafter auth- Replaced sign-in gate UI with "Redirecting to sign in..." loading spinner
- Unauthenticated users visiting
-
Mark as read notifications (2026-02-22 12:00 UTC)
- Added
adminHasReadfield topackageNotesandpackageCommentsschemas - Admin Notes panel auto-marks user notes as read when opened
- Admin Comments panel auto-marks comments as read when opened
- User Profile Messages modal shows unread count and "Mark all read" button
- Notes button shows blue badge for unread user notes (red for unreplied requests)
- Comments button shows blue badge for unread comments
- Added
markNotesAsReadForAdmin,markCommentsAsReadForAdminmutations - Added
getUnreadUserNotesCount,getUnreadCommentsCountqueries
- Added
-
Admin submitter email editor (2026-02-22 12:00 UTC)
- Added
SubmitterEmailEditorcomponent in Admin panel for editing submitter emails - Admin can edit primary submitter email to link submissions to user accounts
- Admin can add additional emails for multi-account access
- Added
updateSubmitterEmailmutation for changing primary email - Useful for submissions created before auth was added
- Added
-
Admin page UX improvements (2026-02-22 12:00 UTC)
- Changed sign-in message from "Sign in with your @convex.dev email..." to "Admin access only"
- Non-admin users are now automatically redirected to
/profileinstead of seeing "Access Denied" - Added
RedirectToProfilecomponent for seamless redirect with loading spinner
-
User profile enhancements (2026-02-22 12:00 UTC)
- Fixed duplicate "My Submissions" title and "Submit New" button
- Added user-controlled visibility: hide/show submissions from directory
- Added delete submission with confirmation modal
- Added edit submission modal (component name, description, category, tags, demo/video URLs)
- Added additionalEmails field to schema for multi-account access
- Updated getMySubmissions to check both submitterEmail and additionalEmails
- Added visibility guide to status guide section
- Users can now manage only their own submissions
-
Changed admin route from
/submit/adminto/submissions/admin(2026-02-22 12:00 UTC)- Admin dashboard now accessible at
/submissions/admin - Note: WorkOS JWT template must include
"email": {{ user.email }}for admin auth to work
- Admin dashboard now accessible at
-
Fixed WorkOS AuthKit sign-in flow (2026-02-22 12:00 UTC)
- OAuth callback component now waits for AuthKit session before redirecting to
/submit - Sign-in buttons call
signIn()directly per Convex WorkOS docs - Added
VITE_WORKOS_REDIRECT_URIenv variable for explicit redirect configuration - Removed
getSignInUrl()workaround in favor of directsignIn()calls - Profile page sign-in now works correctly
- OAuth callback component now waits for AuthKit session before redirecting to
-
Reorganized submission routes (2026-02-22 12:00 UTC)
/submissions= Submit.tsx (public table-based directory with Header)/submissions/admin= Admin.tsx (requires @convex.dev email)/submit= SubmitForm.tsx (auth-gated form)- Submit button on directory links to
/submitform page - Added Submissions link to Header navigation
For admin auth to work, configure your WorkOS JWT template to include the email claim:
- Go to WorkOS Dashboard > Authentication > Sessions > Configure JWT Template
- Add these claims to your template:
{ "email": {{ user.email }}, "name": "{{ user.first_name }} {{ user.last_name }}" } - Save and sign out/in to get a new token
- SubmitForm.tsx layout update (2026-02-22 12:00 UTC)
- Checkboxes moved inside form, above submit button
- Submit button disabled until all 3 checkboxes checked
- FAQ section below form, Terms links at bottom
- Refactored auth flow with shared Header component (2026-02-22 12:00 UTC)
- Created
src/components/Header.tsxwith global navigation and user menu - Header displays on all pages: Directory, Submit, Profile, Admin, ComponentDetail, NotFound
- User menu shows avatar, email, My Submissions link, Sign Out button
- Sign In button for unauthenticated users
- Created
- Submit form refactored to dedicated page (2026-02-22 12:00 UTC)
- Replaced
Submit.tsxmodal approach withSubmitForm.tsxpage - Auth gate: shows sign-in UI for unauthenticated users
- Full form for authenticated users
- Success modal links to profile page
- Replaced
- WorkOS AuthKit integration replacing the legacy auth stack (2026-02-22 12:00 UTC)
- Installed
@workos-inc/authkit-reactand@convex-dev/workos - Configured
convex/auth.config.tswith WorkOS JWT providers - Updated admin authorization to use
ctx.auth.getUserIdentity() - Dynamic Vite base path (
/local,/components/production)
- Installed
- User profile page at
/profilefor managing submissions (2026-02-22 12:00 UTC)- Lists user's submitted components with status badges
- "Send Request" button to message admin team
getMySubmissionsquery andrequestSubmissionRefreshmutationby_submitter_emailindex on packages table
- OAuth callback redirect to
/submit(2026-02-22 12:00 UTC) - Add submission checklist with 3 checkboxes (FAQ, Authoring Components compliance, permission to share)
- Add FAQ section to Submit page with 4 questions about review process, requirements, post-submission, and learning resources
- Add Terms of Service and Privacy Policy links on Submit page
- Add clear thumbnail option in admin
ComponentDetailsEditor - Persist thumbnail removal on Save by wiring
clearThumbnailthroughupdateComponentDetails
- Update packages schema with directory fields (slug, category, tags, descriptions, thumbnail, author, verified)
- Add new indexes (by_slug, by_category, by_category_and_visibility)
- Add badgeFetches table for badge analytics
- Build public queries (listApprovedComponents, getComponentBySlug, listCategories, getFeaturedComponents)
- Build admin mutation (updateComponentDetails)
- Build thumbnail upload mutations (generateUploadUrl, saveThumbnail)
- Build autoFillAuthorFromRepo mutation
- Build internal queries (_getPackageBySlug, _recordBadgeFetch, getBadgeStats)
- Restructure frontend into src/pages/ and src/components/
- Update client-side router for /, /submit, /submit/admin, /:slug routes
- Build Directory.tsx page with search, sort, categories, featured section
- Build ComponentDetail.tsx page with sidebar + content layout
- Build ComponentCard.tsx, CategorySidebar.tsx, SearchBar.tsx, VerifiedBadge.tsx, InstallCommand.tsx
- Build ComponentDetailsEditor.tsx for admin
- Create categories.ts, slugs.ts, seo.ts lib files
- Add dynamic SVG badge HTTP endpoint (/api/badge)
- Add markdown HTTP endpoint (/api/markdown) for agents and LLMs
- Add Share dropdown with View as Markdown, Copy as Markdown, Copy page URL
- Add markdown source view with copy button
- Update submission form with category, descriptions, tags, video URL, thumbnail upload
- Auto-open submit modal from directory sidebar link
- Add admin thumbnail preview in package list
- Fix slug 404 for admin-created slugs (relaxed visibility check)
- Fix auto-fill to update UI instantly without manual toggle
- Fix Back to Components trailing slash
- Remove invalid border-border-primary classes
- Update dropdown styling to match design system
- Move verified badge below downloads in cards
- Redesign component detail page layout (sidebar left, content right)
- Link authorUsername to GitHub profile
- Make thumbnail half-width and left-aligned
- Left-align badge snippet section
- Rename Copy page to Share
- Set Vite base path to /components/
- Build seed script for existing components
- Update files.md with all new files
- Update changelog.md with v2.0.0 entry
- Update task.md with directory expansion tasks
- Update README.md to focus on Convex Components Challenge
- Switch to WorkOS AuthKit (completed 2026-02-22)
- Change submit button back to DF5D34
- Add link to demo app on form and admin
- Remove open graph url link
- Push to GitHub
- Add submit collects users names and email and Convex Discord name
- Admin sees name and admin Convex Discord name
- Add About modal with app description and status legend
- Add Featured status for packages
- Add Status legend bar above footer
- Remove login/signup from frontend header
- Add AI Review feature for validating Convex components
- Update changelog.md with correct dates from git history
- Update files.md with current file descriptions
- Run TypeScript type checks
- Verify build readiness
- Add refresh NPM data button
- Streamline frontend layout for iframe embedding
- Move toolbar controls above package listing
- Update modals to open at top of page
- Simplify Admin page header
- Move Admin status legend below Stats section
- Fix external links to open in new tabs in iframes
- Fix success modal display after submission
- Add email privacy notice to submit form
- Security fix: Strip PII from public queries
- Security fix: Exclude AI review details from public responses
- Security fix: Create internal queries for backend operations
- Security fix: Rename reviewerEmail to reviewedBy
- Updated sec-check.mdc with RLS patterns
- Added AI-Assisted Development Security section
- Added Convex Auth Token Security section
- Added Dependency and Supply Chain Security section
- Enhanced security checklist
- New submissions are marked as "pending" by default and visible on the frontend
- Admins can change status to: pending, in_review, approved, changes_requested, rejected
- Admins can change visibility to: visible, hidden, archived
- Only hidden and archived packages are excluded from the public frontend
- Only approved packages can be marked as "Featured"
- Featured packages show a star icon and are highlighted on convex.dev/components
- Admin clicks "AI Review" button on a package (requires GitHub repository URL)
- System fetches source code from GitHub (convex.config.ts + component files)
- Claude analyzes code against 9 Convex component criteria
- Results show passed/failed/partial status with detailed notes
- Auto-approve triggers if all criteria pass (when enabled)
- Auto-reject triggers if critical criteria fail (when enabled)
- Confirm local changes are merged and pushed
- Deploy backend and frontend
npx convex deploynpm run build(or your normal frontend deploy flow)
- Run one time production backfill
npx convex run packages:backfillPackageReliabilityFields '{}' --prod
- Verify production data paths
- Directory sort
Newestuses newest approved order Most downloadsandRecently updatedstill sort correctly- Rating sort still works with unrated items at the bottom
- Directory sort
- Verify admin behavior
- Approving a package sets
approvedAt - New submissions default to pending and visible
- Auto refresh panel still works as expected
- Approving a package sets
- Spot check 3 to 5 legacy packages for safe defaults
reviewStatusvisibilitysubmittedAtweeklyDownloadslastPublish
- Monitor logs for 10 to 15 minutes after release