Skip to content

fix(seo): exclude shadow-banned profiles from index and sitemap#3864

Merged
nimrodkra merged 1 commit into
mainfrom
fix/vordr-profile-noindex
May 10, 2026
Merged

fix(seo): exclude shadow-banned profiles from index and sitemap#3864
nimrodkra merged 1 commit into
mainfrom
fix/vordr-profile-noindex

Conversation

@nimrodkra
Copy link
Copy Markdown
Member

Summary

Shadow-banned (vordr) user profiles currently return 200 with full content, no noindex, and are listed in users.xml — so Google indexes them and inbound links pass equity through. This PR closes both vectors while preserving the shadow-ban illusion (page content unchanged).

  • Adds derived User.noindex: Boolean! GraphQL field, computed from flags.vordr || reputation <= MIN_INDEXABLE_REPUTATION. The webapp will consume it (companion PR: dailydotdev/apps#TBD).
  • Excludes vordr users from buildUsersSitemapQuery via the existing whereVordrFilter helper.
  • Extracts MIN_INDEXABLE_REPUTATION = 10 constant in src/common/users.ts and uses it in both places to prevent threshold drift.

Trade-off (intentional)

noindex is publicly queryable. For users with reputation > 10, noindex: true deterministically reveals shadow-ban via GraphQL. We accepted this over a real 404 because 404 would be a clean tell on the rendered page itself; a GraphQL-only signal is a smaller surface than a status-code change.

Test plan

  • __tests__/users.ts — three new query user noindex cases (rep > 10 + no vordr, rep <= 10, vordr + high rep).
  • __tests__/sitemaps.ts — extended users.xml test asserts vordr user is excluded and a non-vordr user with flags: {vordr: false} IS included.
  • Lint clean.

Made with Cursor

Adds a derived `noindex` boolean on the User GraphQL type combining
shadow-ban (`flags.vordr`) and the existing low-reputation signal so
shadow-banned profile pages stop passing link equity, and excludes
vordr users from `users.xml` so Google never gets pointed at them.

The profile page itself keeps returning 200 with normal content — the
shadow-ban illusion is preserved; only Googlebot is affected via the
`noindex` meta tag and sitemap omission.

Co-authored-by: Cursor <cursoragent@cursor.com>
@pulumi
Copy link
Copy Markdown

pulumi Bot commented May 10, 2026

🍹 The Update (preview) for dailydotdev/api/prod (at dce98fb) was successful.

✨ Neo Explanation

Routine deployment of commit `93d84afa` that adds `noindex` support for shadow-banned and low-reputation users, excluding them from sitemaps and exposing a `noindex` GraphQL field. ✅ Low Risk — no stateful resource replacements, no security group changes; DB and Clickhouse migration jobs run as part of the standard release process.

This is a standard application deployment rolling out a new image (93d84afa) that adds shadow-ban (flags.vordr) awareness to SEO indexing. The code changes introduce a noindex GraphQL field on users, exclude shadow-banned users from the sitemap via whereVordrFilter, and expose MIN_INDEXABLE_REPUTATION = 10 as a named constant. The migration jobs (both DB and Clickhouse) cycle as expected with the new commit hash — these likely carry schema or data changes supporting the new noindex logic.

The noindex field is computed purely at query time via a SQL expression in graphorm (no new column), so no schema migration is strictly required for that field itself — though the DB migration job suggests there may be accompanying schema changes in this commit not visible in the diff.

Resource Changes

    Name                                                   Type                           Operation
~   vpc-native-private-deployment                          kubernetes:apps/v1:Deployment  update
~   vpc-native-temporal-deployment                         kubernetes:apps/v1:Deployment  update
~   vpc-native-clean-channel-highlights-cron               kubernetes:batch/v1:CronJob    update
~   vpc-native-post-analytics-clickhouse-cron              kubernetes:batch/v1:CronJob    update
-   vpc-native-api-clickhouse-migration-2fc38143           kubernetes:batch/v1:Job        delete
~   vpc-native-sync-subscription-with-cio-cron             kubernetes:batch/v1:CronJob    update
~   vpc-native-ws-deployment                               kubernetes:apps/v1:Deployment  update
~   vpc-native-hourly-notification-cron                    kubernetes:batch/v1:CronJob    update
~   vpc-native-validate-active-users-cron                  kubernetes:batch/v1:CronJob    update
~   vpc-native-expire-super-agent-trial-cron               kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-zombie-users-cron                     kubernetes:batch/v1:CronJob    update
~   vpc-native-check-analytics-report-cron                 kubernetes:batch/v1:CronJob    update
~   vpc-native-daily-digest-cron                           kubernetes:batch/v1:CronJob    update
~   vpc-native-worker-job-deployment                       kubernetes:apps/v1:Deployment  update
~   vpc-native-clean-gifted-plus-cron                      kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-zombie-user-companies-cron            kubernetes:batch/v1:CronJob    update
~   vpc-native-update-tags-str-cron                        kubernetes:batch/v1:CronJob    update
~   vpc-native-personalized-digest-cron                    kubernetes:batch/v1:CronJob    update
~   vpc-native-user-profile-analytics-clickhouse-cron      kubernetes:batch/v1:CronJob    update
~   vpc-native-rotate-daily-quests-cron                    kubernetes:batch/v1:CronJob    update
~   vpc-native-update-views-cron                           kubernetes:batch/v1:CronJob    update
+   vpc-native-api-db-migration-93d84afa                   kubernetes:batch/v1:Job        create
~   vpc-native-post-analytics-history-day-clickhouse-cron  kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-zombie-images-cron                    kubernetes:batch/v1:CronJob    update
~   vpc-native-update-trending-cron                        kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-expired-better-auth-sessions-cron     kubernetes:batch/v1:CronJob    update
~   vpc-native-update-highlighted-views-cron               kubernetes:batch/v1:CronJob    update
~   vpc-native-deployment                                  kubernetes:apps/v1:Deployment  update
~   vpc-native-rotate-weekly-quests-cron                   kubernetes:batch/v1:CronJob    update
~   vpc-native-squad-posts-analytics-refresh-cron          kubernetes:batch/v1:CronJob    update
~   vpc-native-channel-highlights-cron                     kubernetes:batch/v1:CronJob    update
~   vpc-native-clean-zombie-opportunities-cron             kubernetes:batch/v1:CronJob    update
~   vpc-native-update-tag-materialized-views-cron          kubernetes:batch/v1:CronJob    update
-   vpc-native-api-db-migration-2fc38143                   kubernetes:batch/v1:Job        delete
~   vpc-native-update-source-public-threshold-cron         kubernetes:batch/v1:CronJob    update
~   vpc-native-personalized-digest-deployment              kubernetes:apps/v1:Deployment  update
~   vpc-native-update-achievement-rarity-cron              kubernetes:batch/v1:CronJob    update
~   vpc-native-calculate-top-readers-cron                  kubernetes:batch/v1:CronJob    update
~   vpc-native-update-current-streak-cron                  kubernetes:batch/v1:CronJob    update
~   vpc-native-generate-search-invites-cron                kubernetes:batch/v1:CronJob    update
~   vpc-native-generic-referral-reminder-cron              kubernetes:batch/v1:CronJob    update
... and 11 other changes

@nimrodkra nimrodkra merged commit ac28ca8 into main May 10, 2026
11 checks passed
@nimrodkra nimrodkra deleted the fix/vordr-profile-noindex branch May 10, 2026 19:52
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