Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@steven-tey
Copy link
Collaborator

@steven-tey steven-tey commented Nov 9, 2025

Summary by CodeRabbit

  • New Features

    • Links can be marked as disabled and show a "Disabled" indicator with explanatory tooltip.
    • Partner status badges now include detailed ban tooltips.
    • Status badges support compact and standard size variants.
  • Improvements

    • Not-found/disabled link flow now redirects or rewrites to configured not-found destinations.
    • Domain clicks tooltip now shows formatted count and β€œLast clicked” info.
    • Link payloads and schemas now include a disabledAt field.
  • Tests

    • Added redirect test covering disabled links.

@vercel
Copy link
Contributor

vercel bot commented Nov 9, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Updated (UTC)
dub Ready Ready Preview Nov 9, 2025 3:40am

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 9, 2025

Walkthrough

Adds a nullable disabledAt link field across types, storage, API, middleware, tests, and UI; centralizes not-found handling into handleNotFoundLink; treats disabled links as not-found; introduces badge/tooltip UI for disabled/banned states; scopes Tinybird helpers and simplifies a migration script.

Changes

Cohort / File(s) Change Summary
Types & Schemas
apps/web/lib/types.ts, apps/web/lib/zod/schemas/links.ts
Added optional disabledAt to RedisLinkProps and LinkSchema (nullable string) and added disabledAt coercion to linkEventSchema.
Redis Formatter
apps/web/lib/upstash/format-redis-link.ts
Destructures and conditionally includes disabledAt in returned RedisLinkProps.
API transform
apps/web/lib/api/links/utils/transform-link.ts
Removed disabledAt from explicit destructuring so it flows through via rest/spread in API output.
Middleware & Not-Found Handling
apps/web/lib/middleware/link.ts, apps/web/lib/middleware/utils/handle-not-found-link.ts
New handleNotFoundLink(req) utility; middleware delegates not-found flow to it, fetches disabledAt from cachedLink and treats disabled links as not-found via the handler.
Tinybird / Recording
apps/web/lib/tinybird/record-link.ts
Made internal helpers non-exported; transformLinkTB defaults tag_ids to [] and adds partner_tag_ids: [].
UI β€” Disabled Link Indicators
apps/web/ui/links/disabled-link-tooltip.tsx, apps/web/ui/links/link-title-column.tsx, apps/web/ui/links/short-link-input.tsx
Added DisabledLinkTooltip component; conditionally render when disabledAt present; widened ShortLinkInputProps to accept `existingLinkProps.key
UI β€” Partner Status Badge & Consumers
apps/web/ui/partners/partner-status-badge-with-tooltip.tsx, apps/web/ui/partners/partner-info-section.tsx, apps/web/ui/partners/partner-info-cards.tsx, apps/web/ui/links/link-builder/link-partner-details.tsx
New PartnerStatusBadgeWithTooltip component; replaced previous inline badge/tooltip logic with this component; added optional showPartnerStatus prop to PartnerInfoSection.
UI Library β€” StatusBadge
packages/ui/src/status-badge.tsx
Added size prop (sm
Tests / Test Schema Helpers
apps/web/tests/redirects/index.test.ts, apps/web/tests/utils/schema.ts
Added "disabled link" redirect test; included disabledAt: null in test expected objects and adjusted test schema exports.
Migration Script
apps/web/scripts/migrations/backfill-banned-partner-links.ts
Simplified batching to a single fixed Prisma query (skip/take), consolidated update/log flow and Tinybird calls.
Webhook Samples
apps/web/lib/webhook/sample-events/*.json
Added disabledAt: null to multiple sample webhook events (lead-created.json, link-created.json, link-updated.json, link-deleted.json, link-clicked.json, sale-created.json).

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant NextMiddleware
    participant LinkMiddleware
    participant Cache as CachedLinkStore
    participant Edge as getDomainViaEdge
    participant NotFoundHandler
    participant Response

    User->>NextMiddleware: HTTP request /{short}
    NextMiddleware->>LinkMiddleware: handoff
    LinkMiddleware->>Cache: fetch cachedLink
    alt cachedLink exists
        LinkMiddleware->>LinkMiddleware: check cachedLink.disabledAt
        alt disabledAt set
            LinkMiddleware->>NotFoundHandler: handleNotFoundLink(req)
            NotFoundHandler->>Edge: fetch domain config
            Edge-->>NotFoundHandler: domain (maybe notFoundUrl)
            alt domain.notFoundUrl
                NotFoundHandler-->>Response: 302 redirect (+ X-Robots-Tag, headers)
            else
                NotFoundHandler-->>Response: rewrite -> /{domain}/not-found (with headers)
            end
        else active link
            LinkMiddleware-->>Response: redirect to target
        end
    else not found
        LinkMiddleware->>NotFoundHandler: handleNotFoundLink(req)
        NotFoundHandler-->>Response: redirect or rewrite
    end
    Response-->>User: HTTP response
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Areas to focus review on:
    • apps/web/lib/middleware/link.ts and apps/web/lib/middleware/utils/handle-not-found-link.ts β€” header propagation, redirect vs rewrite logic, DUB_HEADERS usage.
    • Typing and propagation of disabledAt across types.ts, format-redis-link.ts, transform-link.ts, zod schemas, and tests.
    • UI conditional rendering and prop-type change in ShortLinkInputProps.
    • Migration script behavior change from iterative batches to single fixed batch.

Possibly related PRs

Suggested reviewers

  • devkiran

Poem

πŸ‡
I nibbled code and found a subtle flag,
A timestamp tucked where broken links might lag.
Tooltips bloom, redirects now politely hide,
The rabbit hops β€” disabled links step aside.
Cheers from the burrow, small changes, big stride.

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
βœ… Passed checks (2 passed)
Check name Status Explanation
Description Check βœ… Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check βœ… Passed The title 'Improve support for disabled links' accurately reflects the main objective of the changeset, which introduces comprehensive support for a disabledAt field across the codebase.
✨ Finishing touches
  • πŸ“ Generate docstrings
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch disabled-links

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❀️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (3)
apps/web/scripts/migrations/backfill-banned-partner-links.ts (2)

5-5: Use absolute import path for consistency.

The import path changed to a relative path (../../lib/tinybird/record-link), while other imports use absolute paths with the @/ alias. Relative paths are more brittle and inconsistent with the codebase style.

Apply this diff to use the absolute import:

-import { recordLink } from "../../lib/tinybird/record-link";
+import { recordLink } from "@/lib/tinybird/record-link";

31-47: Add error handling to prevent data inconsistency.

If the updateMany operation succeeds but recordLink fails, the database will be updated but Tinybird won't reflect the changes. Consider adding error handling and logging to track failures.

Apply this diff to add basic error handling:

  console.log(`Found ${links.length} links to process.`);
- const prismaRes = await prisma.link.updateMany({
-   where: {
-     id: {
-       in: links.map((link) => link.id),
-     },
-   },
-   data: {
-     disabledAt: new Date(),
-   },
- });
- console.log(`Updated ${prismaRes.count} links to be disabled.`);
-
- const tbRes = await recordLink(links, {
-   deleted: true,
- });
-
- console.log("Deleted links in Tinybird", tbRes);
+ try {
+   const prismaRes = await prisma.link.updateMany({
+     where: {
+       id: {
+         in: links.map((link) => link.id),
+       },
+     },
+     data: {
+       disabledAt: new Date(),
+     },
+   });
+   console.log(`Updated ${prismaRes.count} links to be disabled.`);
+
+   const tbRes = await recordLink(links, {
+     deleted: true,
+   });
+
+   console.log("Deleted links in Tinybird", tbRes);
+ } catch (error) {
+   console.error("Error processing batch:", error);
+   throw error;
+ }
apps/web/ui/partners/partner-info-section.tsx (1)

52-54: Excellent refactoring to use the shared component.

The replacement of inline badge/tooltip logic with PartnerStatusBadgeWithTooltip improves code reusability and maintainability. The component correctly receives all required properties through the partner object.

If different badge sizes are needed in the future, consider exposing a badgeSize prop that can be passed through to PartnerStatusBadgeWithTooltip:

export function PartnerInfoSection({
  partner,
  showPartnerStatus = true,
  badgeSize = "md",
  children,
}: PropsWithChildren<{
  showPartnerStatus?: boolean;
  badgeSize?: "sm" | "md";
  partner: Pick<...>;
}>) {
  // ...
  <PartnerStatusBadgeWithTooltip partner={partner} size={badgeSize} />
}
πŸ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 6d60f1b and 0744923.

πŸ“’ Files selected for processing (16)
  • apps/web/lib/api/links/utils/transform-link.ts (0 hunks)
  • apps/web/lib/middleware/link.ts (4 hunks)
  • apps/web/lib/middleware/utils/handle-not-found-link.ts (1 hunks)
  • apps/web/lib/tinybird/record-link.ts (2 hunks)
  • apps/web/lib/types.ts (1 hunks)
  • apps/web/lib/upstash/format-redis-link.ts (2 hunks)
  • apps/web/lib/zod/schemas/links.ts (1 hunks)
  • apps/web/scripts/migrations/backfill-banned-partner-links.ts (1 hunks)
  • apps/web/ui/links/disabled-link-tooltip.tsx (1 hunks)
  • apps/web/ui/links/link-builder/link-partner-details.tsx (2 hunks)
  • apps/web/ui/links/link-title-column.tsx (2 hunks)
  • apps/web/ui/links/short-link-input.tsx (2 hunks)
  • apps/web/ui/partners/partner-info-cards.tsx (2 hunks)
  • apps/web/ui/partners/partner-info-section.tsx (2 hunks)
  • apps/web/ui/partners/partner-status-badge-with-tooltip.tsx (1 hunks)
  • packages/ui/src/status-badge.tsx (3 hunks)
πŸ’€ Files with no reviewable changes (1)
  • apps/web/lib/api/links/utils/transform-link.ts
🧰 Additional context used
🧠 Learnings (8)
πŸ“š Learning: 2025-10-08T21:33:23.553Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2936
File: apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/settings/analytics/add-hostname-modal.tsx:28-34
Timestamp: 2025-10-08T21:33:23.553Z
Learning: In the dub/ui Button component, when the `disabledTooltip` prop is set to a non-undefined value (e.g., a string), the button is automatically disabled. Therefore, it's not necessary to also add the same condition to the `disabled` propβ€”setting `disabledTooltip={permissionsError || undefined}` is sufficient to disable the button when there's a permissions error.

Applied to files:

  • apps/web/ui/links/short-link-input.tsx
  • apps/web/ui/links/link-title-column.tsx
  • apps/web/ui/links/disabled-link-tooltip.tsx
πŸ“š Learning: 2025-09-17T17:40:35.470Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2857
File: apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/resources/program-help-and-support.tsx:95-121
Timestamp: 2025-09-17T17:40:35.470Z
Learning: In the Dub UI Switch component, providing a truthy `disabledTooltip` prop automatically disables the switch and prevents user interaction, so an explicit `disabled` prop is not needed when using `disabledTooltip`.

Applied to files:

  • apps/web/ui/links/short-link-input.tsx
  • apps/web/ui/links/link-title-column.tsx
  • apps/web/ui/links/disabled-link-tooltip.tsx
πŸ“š Learning: 2025-09-17T17:40:35.470Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2857
File: apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/program/resources/program-help-and-support.tsx:95-121
Timestamp: 2025-09-17T17:40:35.470Z
Learning: In the Dub UI Switch component, providing a truthy `disabledTooltip` prop automatically disables the switch and prevents user interaction, so an explicit `disabled` prop is not needed when using `disabledTooltip`. The component computes `switchDisabled = disabledTooltip ? true : disabled || loading` and passes this to the underlying Radix Switch primitive.

Applied to files:

  • apps/web/ui/links/short-link-input.tsx
  • apps/web/ui/links/link-title-column.tsx
  • apps/web/ui/links/disabled-link-tooltip.tsx
πŸ“š Learning: 2025-05-29T04:45:18.504Z
Learnt from: devkiran
Repo: dubinc/dub PR: 2448
File: packages/email/src/templates/partner-program-summary.tsx:0-0
Timestamp: 2025-05-29T04:45:18.504Z
Learning: In the PartnerProgramSummary email template (packages/email/src/templates/partner-program-summary.tsx), the stat titles are hardcoded constants ("Clicks", "Leads", "Sales", "Earnings") that will always match the ICONS object keys after toLowerCase() conversion, so icon lookup failures are not possible.

Applied to files:

  • apps/web/ui/links/link-builder/link-partner-details.tsx
  • apps/web/ui/partners/partner-info-cards.tsx
πŸ“š Learning: 2025-06-06T07:59:03.120Z
Learnt from: devkiran
Repo: dubinc/dub PR: 2177
File: apps/web/lib/api/links/bulk-create-links.ts:66-84
Timestamp: 2025-06-06T07:59:03.120Z
Learning: In apps/web/lib/api/links/bulk-create-links.ts, the team accepts the risk of potential undefined results from links.find() operations when building invalidLinks arrays, because existing links are fetched from the database based on the input links, so matches are expected to always exist.

Applied to files:

  • apps/web/lib/tinybird/record-link.ts
  • apps/web/scripts/migrations/backfill-banned-partner-links.ts
  • apps/web/lib/middleware/utils/handle-not-found-link.ts
  • apps/web/lib/middleware/link.ts
πŸ“š Learning: 2025-09-24T16:10:37.349Z
Learnt from: TWilson023
Repo: dubinc/dub PR: 2872
File: apps/web/ui/partners/partner-about.tsx:11-11
Timestamp: 2025-09-24T16:10:37.349Z
Learning: In the Dub codebase, the team prefers to import Icon as a runtime value from "dub/ui" and uses Icon as both a type and variable name in component props, even when this creates shadowing. This is their established pattern and should not be suggested for refactoring.

Applied to files:

  • apps/web/ui/partners/partner-info-cards.tsx
πŸ“š Learning: 2025-09-19T18:46:43.787Z
Learnt from: CR
Repo: dubinc/dub PR: 0
File: packages/hubspot-app/CLAUDE.md:0-0
Timestamp: 2025-09-19T18:46:43.787Z
Learning: Applies to packages/hubspot-app/app/cards/**/*.{js,jsx,ts,tsx} : Only use components exported by hubspot/ui-extensions within card components

Applied to files:

  • apps/web/ui/partners/partner-info-cards.tsx
πŸ“š Learning: 2025-10-15T01:05:43.266Z
Learnt from: steven-tey
Repo: dubinc/dub PR: 2958
File: apps/web/app/app.dub.co/(dashboard)/[slug]/settings/members/page-client.tsx:432-457
Timestamp: 2025-10-15T01:05:43.266Z
Learning: In apps/web/app/app.dub.co/(dashboard)/[slug]/settings/members/page-client.tsx, defer refactoring the custom MenuItem component (lines 432-457) to use the shared dub/ui MenuItem component to a future PR, as requested by steven-tey.

Applied to files:

  • apps/web/ui/partners/partner-info-section.tsx
🧬 Code graph analysis (10)
apps/web/ui/links/short-link-input.tsx (2)
apps/web/lib/types.ts (1)
  • LinkProps (134-134)
apps/web/ui/links/disabled-link-tooltip.tsx (1)
  • DisabledLinkTooltip (3-33)
apps/web/ui/links/link-builder/link-partner-details.tsx (1)
apps/web/ui/partners/partner-status-badge-with-tooltip.tsx (1)
  • PartnerStatusBadgeWithTooltip (7-57)
apps/web/lib/tinybird/record-link.ts (2)
apps/web/lib/tinybird/client.ts (2)
  • tb (3-6)
  • tbOld (9-12)
apps/web/lib/api/links/utils/transform-link.ts (1)
  • ExpandedLink (12-22)
apps/web/ui/partners/partner-info-cards.tsx (1)
apps/web/ui/partners/partner-status-badge-with-tooltip.tsx (1)
  • PartnerStatusBadgeWithTooltip (7-57)
apps/web/scripts/migrations/backfill-banned-partner-links.ts (3)
packages/prisma/index.ts (1)
  • prisma (3-9)
apps/web/lib/api/links/include-program-enrollment.ts (1)
  • includeProgramEnrollment (3-9)
apps/web/lib/tinybird/record-link.ts (1)
  • recordLink (83-100)
apps/web/ui/links/link-title-column.tsx (1)
apps/web/ui/links/disabled-link-tooltip.tsx (1)
  • DisabledLinkTooltip (3-33)
apps/web/ui/partners/partner-info-section.tsx (1)
apps/web/ui/partners/partner-status-badge-with-tooltip.tsx (1)
  • PartnerStatusBadgeWithTooltip (7-57)
apps/web/lib/middleware/link.ts (1)
apps/web/lib/middleware/utils/handle-not-found-link.ts (1)
  • handleNotFoundLink (6-26)
apps/web/ui/links/disabled-link-tooltip.tsx (1)
packages/ui/src/tooltip.tsx (1)
  • Tooltip (32-88)
apps/web/ui/partners/partner-status-badge-with-tooltip.tsx (4)
apps/web/lib/types.ts (1)
  • EnrolledPartnerProps (453-453)
apps/web/ui/partners/partner-status-badges.ts (1)
  • PartnerStatusBadges (11-60)
packages/ui/src/tooltip.tsx (1)
  • DynamicTooltipWrapper (280-294)
apps/web/lib/zod/schemas/partners.ts (1)
  • BAN_PARTNER_REASONS (67-74)
πŸͺ› Biome (2.1.2)
apps/web/ui/links/disabled-link-tooltip.tsx

[error] 11-11: Avoid using target="_blank" without rel="noopener" or rel="noreferrer".

Opening external links in new tabs without rel="noopener" is a security risk. See the explanation for more details.
Safe fix: Add the rel="noopener" attribute.

(lint/security/noBlankTarget)


[error] 19-19: Avoid using target="_blank" without rel="noopener" or rel="noreferrer".

Opening external links in new tabs without rel="noopener" is a security risk. See the explanation for more details.
Safe fix: Add the rel="noopener" attribute.

(lint/security/noBlankTarget)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
πŸ”‡ Additional comments (9)
apps/web/scripts/migrations/backfill-banned-partner-links.ts (1)

43-45: Verify the deleted: true flag is correct for disabled links.

The script sets disabledAt on links (disabling them) but marks them as deleted: true in Tinybird. Ensure this is intentional behavior, as "disabled" and "deleted" have different semantic meanings.

If disabled links should be tracked separately from deleted links in Tinybird, consider whether a different flag or approach is needed.

packages/ui/src/status-badge.tsx (1)

25-28: LGTM! Size variant implementation is clean.

The size prop integration follows the established cva pattern correctly, with appropriate padding adjustments for sm and md variants.

Also applies to: 55-55, 69-69

apps/web/lib/types.ts (1)

166-166: LGTM! Field addition follows existing patterns.

The disabledAt field is correctly typed and placed alongside similar timestamp fields like expiresAt.

apps/web/lib/zod/schemas/links.ts (1)

646-651: LGTM! Schema definition is clear and comprehensive.

The disabledAt field follows the existing pattern for timestamp fields, and the description clearly explains the impact on both redirection and analytics.

apps/web/ui/links/link-builder/link-partner-details.tsx (1)

36-41: LGTM! Partner status badge integration is clean.

The flex layout with gap-2 properly accommodates both the partner name and status badge, while maintaining text truncation behavior.

apps/web/ui/links/link-title-column.tsx (1)

145-145: LGTM! Disabled link indicator is properly placed.

The conditional rendering of DisabledLinkTooltip follows the existing pattern for other badges and indicators in the link title row.

apps/web/lib/upstash/format-redis-link.ts (1)

16-16: LGTM! Propagation follows established patterns.

The disabledAt field is correctly destructured and conditionally spread into the return object, mirroring the handling of similar optional fields like expiresAt and expiredUrl.

Also applies to: 45-45

apps/web/ui/partners/partner-info-cards.tsx (1)

178-180: LGTM! Badge rendering is now centralized.

The refactoring to use PartnerStatusBadgeWithTooltip consolidates the badge logic while maintaining the same conditional rendering behavior for enrolled partners.

apps/web/ui/partners/partner-info-section.tsx (1)

2-5: LGTM! Clean import refactoring.

The import changes correctly reflect the delegation of badge rendering logic to the PartnerStatusBadgeWithTooltip component. The Tooltip import is appropriately retained for the country flag tooltip on line 34.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

πŸ“œ Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

πŸ“₯ Commits

Reviewing files that changed from the base of the PR and between 0b7d3a6 and bed5891.

πŸ“’ Files selected for processing (7)
  • apps/web/lib/webhook/sample-events/lead-created.json (1 hunks)
  • apps/web/lib/webhook/sample-events/link-clicked.json (1 hunks)
  • apps/web/lib/webhook/sample-events/link-created.json (1 hunks)
  • apps/web/lib/webhook/sample-events/link-deleted.json (1 hunks)
  • apps/web/lib/webhook/sample-events/link-updated.json (1 hunks)
  • apps/web/lib/webhook/sample-events/sale-created.json (1 hunks)
  • apps/web/lib/zod/schemas/links.ts (2 hunks)
βœ… Files skipped from review due to trivial changes (1)
  • apps/web/lib/webhook/sample-events/link-updated.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
πŸ”‡ Additional comments (6)
apps/web/lib/zod/schemas/links.ts (1)

646-651: LGTM! Clear description for the new field.

The disabledAt field is properly defined with a clear description explaining the behavior when a link is disabled.

apps/web/lib/webhook/sample-events/link-created.json (1)

14-14: LGTM! Sample event updated with new field.

The addition of disabledAt: null aligns with the schema changes and maintains consistency across webhook sample events.

apps/web/lib/webhook/sample-events/sale-created.json (1)

40-40: LGTM! Consistent with schema changes.

The disabledAt: null field addition maintains consistency with other webhook samples.

apps/web/lib/webhook/sample-events/link-clicked.json (1)

31-31: LGTM! Field properly added.

The addition of disabledAt: null is correctly positioned and consistent with the schema update.

apps/web/lib/webhook/sample-events/lead-created.json (1)

40-40: LGTM! Sample event aligned with schema.

The disabledAt: null field properly reflects the new schema definition.

apps/web/lib/webhook/sample-events/link-deleted.json (1)

14-14: LGTM! Webhook sample updated correctly.

The addition of disabledAt: null completes the consistent update across all webhook sample events.

@steven-tey steven-tey merged commit 987e94a into main Nov 9, 2025
7 of 8 checks passed
@steven-tey steven-tey deleted the disabled-links branch November 9, 2025 03:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants