diff --git a/packages/shared/src/components/post/PostUpvotesCommentsCount.spec.tsx b/packages/shared/src/components/post/PostUpvotesCommentsCount.spec.tsx
deleted file mode 100644
index e26177ac5c..0000000000
--- a/packages/shared/src/components/post/PostUpvotesCommentsCount.spec.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import React from 'react';
-import { render, screen } from '@testing-library/react';
-import type { Post } from '../../graphql/posts';
-import { UserVote } from '../../graphql/posts';
-import { PostUpvotesCommentsCount } from './PostUpvotesCommentsCount';
-
-const mockUseConditionalFeature = jest.fn();
-const mockUseAuthContext = jest.fn();
-const mockOpenModal = jest.fn();
-
-jest.mock('../../hooks/useConditionalFeature', () => ({
- useConditionalFeature: () => mockUseConditionalFeature(),
-}));
-
-jest.mock('../../contexts/AuthContext', () => ({
- useAuthContext: () => mockUseAuthContext(),
-}));
-
-jest.mock('../../hooks/useLazyModal', () => ({
- useLazyModal: () => ({ openModal: mockOpenModal }),
-}));
-
-jest.mock('../../hooks/useCoresFeature', () => ({
- useHasAccessToCores: () => false,
-}));
-
-jest.mock('../../lib/user', () => ({
- canViewPostAnalytics: () => false,
-}));
-
-describe('PostUpvotesCommentsCount', () => {
- beforeEach(() => {
- jest.clearAllMocks();
- mockUseAuthContext.mockReturnValue({ user: { id: 'user-id' } });
- mockUseConditionalFeature.mockReturnValue({
- value: {
- threshold: 3,
- belowThresholdLabel: 'New',
- newWindowHours: 24,
- },
- });
- });
-
- it('does not render below-threshold label on post page', () => {
- const post = {
- id: 'post-id',
- createdAt: new Date().toISOString(),
- numUpvotes: 1,
- numComments: 0,
- numAwards: 0,
- numReposts: 0,
- userState: {
- vote: UserVote.None,
- },
- } as Post;
-
- render(
);
-
- expect(screen.queryByText('New')).not.toBeInTheDocument();
- });
-});
diff --git a/packages/shared/src/components/post/PostUpvotesCommentsCount.tsx b/packages/shared/src/components/post/PostUpvotesCommentsCount.tsx
index 0a0be12118..8e5599d401 100644
--- a/packages/shared/src/components/post/PostUpvotesCommentsCount.tsx
+++ b/packages/shared/src/components/post/PostUpvotesCommentsCount.tsx
@@ -1,15 +1,8 @@
import type { ReactElement } from 'react';
import React from 'react';
-import {
- POST_REPOSTS_BY_ID_QUERY,
- UserVote,
- type Post,
-} from '../../graphql/posts';
+import { POST_REPOSTS_BY_ID_QUERY, type Post } from '../../graphql/posts';
import { ClickableText } from '../buttons/ClickableText';
import { largeNumberFormat } from '../../lib';
-import { useConditionalFeature } from '../../hooks/useConditionalFeature';
-import { featureUpvoteCountThreshold } from '../../lib/featureManagement';
-import { getUpvoteCountDisplay } from '../../lib/post';
import { Image } from '../image/Image';
import { useLazyModal } from '../../hooks/useLazyModal';
import { LazyModal } from '../modals/common/types';
@@ -34,25 +27,11 @@ export function PostUpvotesCommentsCount({
}: PostUpvotesCommentsCountProps): ReactElement {
const { openModal } = useLazyModal();
const { user } = useAuthContext();
- const isLoggedIn = !!user;
- const { value: upvoteThresholdConfig } = useConditionalFeature({
- feature: featureUpvoteCountThreshold,
- shouldEvaluate: isLoggedIn,
- });
const upvotes = post.numUpvotes || 0;
const comments = post.numComments || 0;
const awards = post.numAwards || 0;
const reposts = post.numReposts || 0;
const hasAccessToCores = useHasAccessToCores();
- const userHasUpvoted = post.userState?.vote === UserVote.Up;
- const { showCount: showUpvotes } = getUpvoteCountDisplay(
- upvotes,
- upvoteThresholdConfig.threshold,
- upvoteThresholdConfig.belowThresholdLabel,
- userHasUpvoted,
- post.createdAt,
- upvoteThresholdConfig.newWindowHours,
- );
const onRepostsClick = () =>
openModal({
type: LazyModal.RepostsPopup,
@@ -80,7 +59,7 @@ export function PostUpvotesCommentsCount({
{post.analytics.impressions > 1 ? 's' : ''}
)}
- {showUpvotes && (
+ {upvotes > 0 && (
onUpvotesClick?.(upvotes)}>
{largeNumberFormat(upvotes)} Upvote{upvotes > 1 ? 's' : ''}
diff --git a/packages/shared/src/components/post/SocialTwitterPostContent.tsx b/packages/shared/src/components/post/SocialTwitterPostContent.tsx
index 64bb8c7b7a..6d6f8a9191 100644
--- a/packages/shared/src/components/post/SocialTwitterPostContent.tsx
+++ b/packages/shared/src/components/post/SocialTwitterPostContent.tsx
@@ -163,7 +163,6 @@ function SocialTwitterPostContentRaw({
{!!post.createdAt && }
diff --git a/packages/shared/src/components/widgets/SimilarPosts.tsx b/packages/shared/src/components/widgets/SimilarPosts.tsx
index 96099ddc93..126ed33388 100644
--- a/packages/shared/src/components/widgets/SimilarPosts.tsx
+++ b/packages/shared/src/components/widgets/SimilarPosts.tsx
@@ -3,7 +3,6 @@ import React, { useContext } from 'react';
import classNames from 'classnames';
import Link from '../utilities/Link';
import { ArrowIcon } from '../icons';
-import { UserVote } from '../../graphql/posts';
import type { Post } from '../../graphql/posts';
import styles from '../cards/common/Card.module.css';
import { LazyImage } from '../LazyImage';
@@ -82,9 +81,6 @@ const DefaultListItem = ({ post, onLinkClick }: PostProps): ReactElement => (
)}
diff --git a/packages/shared/src/lib/featureManagement.ts b/packages/shared/src/lib/featureManagement.ts
index db3a5cf33c..acc5a652c4 100644
--- a/packages/shared/src/lib/featureManagement.ts
+++ b/packages/shared/src/lib/featureManagement.ts
@@ -151,13 +151,3 @@ export const sharedPostPreviewFeature = new Feature(
'shared_post_preview',
false,
);
-
-export const featureUpvoteCountThreshold = new Feature<{
- threshold: number;
- belowThresholdLabel: string;
- newWindowHours: number;
-}>('upvote_count_threshold', {
- threshold: 0,
- belowThresholdLabel: '',
- newWindowHours: 24,
-});
diff --git a/packages/shared/src/lib/post.spec.ts b/packages/shared/src/lib/post.spec.ts
deleted file mode 100644
index 49eacdfede..0000000000
--- a/packages/shared/src/lib/post.spec.ts
+++ /dev/null
@@ -1,149 +0,0 @@
-import { getUpvoteCountDisplay } from './post';
-
-describe('getUpvoteCountDisplay', () => {
- const now = new Date('2026-03-30T12:00:00.000Z');
-
- beforeEach(() => {
- jest.spyOn(Date, 'now').mockReturnValue(now.getTime());
- });
-
- afterEach(() => {
- jest.restoreAllMocks();
- });
-
- it('shows label for recent posts below threshold with zero upvotes', () => {
- const result = getUpvoteCountDisplay(
- 0,
- 3,
- 'New',
- false,
- '2026-03-30T11:00:00.000Z',
- 24,
- );
-
- expect(result).toEqual({ showCount: false, belowThresholdLabel: 'New' });
- });
-
- it('shows label for recent posts below threshold with positive upvotes', () => {
- const result = getUpvoteCountDisplay(
- 2,
- 3,
- 'New',
- false,
- '2026-03-30T11:00:00.000Z',
- 24,
- );
-
- expect(result).toEqual({ showCount: false, belowThresholdLabel: 'New' });
- });
-
- it('supports empty configured label', () => {
- const result = getUpvoteCountDisplay(
- 2,
- 3,
- '',
- false,
- '2026-03-30T11:00:00.000Z',
- 24,
- );
-
- expect(result).toEqual({ showCount: false, belowThresholdLabel: '' });
- });
-
- it('hides label for old posts below threshold', () => {
- const result = getUpvoteCountDisplay(
- 2,
- 3,
- 'New',
- false,
- '2026-03-28T11:00:00.000Z',
- 24,
- );
-
- expect(result).toEqual({ showCount: false, belowThresholdLabel: '' });
- });
-
- it('hides label for yesterday posts even within 24-hour window', () => {
- const result = getUpvoteCountDisplay(
- 1,
- 3,
- 'New',
- false,
- '2026-03-29T23:30:00.000Z',
- 24,
- );
-
- expect(result).toEqual({ showCount: false, belowThresholdLabel: '' });
- });
-
- it('hides label when createdAt is undefined', () => {
- const result = getUpvoteCountDisplay(1, 3, 'New', false, undefined, 24);
-
- expect(result).toEqual({ showCount: false, belowThresholdLabel: '' });
- });
-
- it('shows numeric count at or above threshold', () => {
- const result = getUpvoteCountDisplay(
- 3,
- 3,
- 'New',
- false,
- '2026-03-30T11:00:00.000Z',
- 24,
- );
-
- expect(result).toEqual({ showCount: true, belowThresholdLabel: '' });
- });
-
- it('shows numeric count for old posts at threshold', () => {
- const result = getUpvoteCountDisplay(
- 3,
- 3,
- 'New',
- false,
- '2026-03-28T11:00:00.000Z',
- 24,
- );
-
- expect(result).toEqual({ showCount: true, belowThresholdLabel: '' });
- });
-
- it('shows numeric count when user already upvoted', () => {
- const result = getUpvoteCountDisplay(
- 0,
- 3,
- 'New',
- true,
- '2026-03-30T11:00:00.000Z',
- 24,
- );
-
- expect(result).toEqual({ showCount: true, belowThresholdLabel: '' });
- });
-
- it('keeps control behavior when threshold is disabled', () => {
- const result = getUpvoteCountDisplay(
- 1,
- 0,
- 'New',
- false,
- '2026-03-30T11:00:00.000Z',
- 24,
- );
-
- expect(result).toEqual({ showCount: true, belowThresholdLabel: '' });
- });
-
- it('hides count for zero upvotes when threshold is disabled', () => {
- const result = getUpvoteCountDisplay(
- 0,
- 0,
- 'New',
- false,
- '2026-03-30T11:00:00.000Z',
- 24,
- );
-
- expect(result).toEqual({ showCount: false, belowThresholdLabel: '' });
- });
-});
diff --git a/packages/shared/src/lib/post.ts b/packages/shared/src/lib/post.ts
deleted file mode 100644
index 789f2a3025..0000000000
--- a/packages/shared/src/lib/post.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { isSameDay } from 'date-fns';
-
-export interface UpvoteCountDisplay {
- showCount: boolean;
- belowThresholdLabel: string;
-}
-
-function isTodayPost(
- createdAt: string | Date | undefined,
- newWindowHours: number,
-): boolean {
- // Missing/invalid publish dates are treated as non-recent to avoid
- // showing a misleading below-threshold freshness label.
- if (!createdAt) {
- return false;
- }
-
- const createdAtMs = new Date(createdAt).getTime();
- if (Number.isNaN(createdAtMs)) {
- return false;
- }
-
- const nowMs = Date.now();
- const createdAtDate = new Date(createdAtMs);
- const nowDate = new Date(nowMs);
- if (!isSameDay(createdAtDate, nowDate)) {
- return false;
- }
-
- const windowMs = Math.max(0, newWindowHours) * 60 * 60 * 1000;
- // Inclusive boundary is intentional: content exactly at the window limit
- // is still considered within the "Today" window.
- return nowMs - createdAtMs <= windowMs;
-}
-
-export function getUpvoteCountDisplay(
- numUpvotes: number,
- threshold: number,
- belowThresholdLabel: string,
- userHasUpvoted: boolean,
- createdAt?: string | Date,
- newWindowHours = 24,
-): UpvoteCountDisplay {
- if (userHasUpvoted) {
- return { showCount: true, belowThresholdLabel: '' };
- }
-
- if (threshold <= 0) {
- if (numUpvotes <= 0) {
- return { showCount: false, belowThresholdLabel: '' };
- }
-
- return { showCount: true, belowThresholdLabel: '' };
- }
-
- if (numUpvotes >= threshold) {
- return { showCount: true, belowThresholdLabel: '' };
- }
-
- if (!isTodayPost(createdAt, newWindowHours)) {
- return { showCount: false, belowThresholdLabel: '' };
- }
-
- return { showCount: false, belowThresholdLabel };
-}