Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
e1e7b01
build(extension): version 3.46.6
rebelchris Aug 6, 2026
ffea5ba
feat(world): count a visit to someone else's world towards the tour (…
idoshamun Aug 6, 2026
1326260
feat(cookies): style iubenda TCF banner like the in-house cookie bann…
pnvasanth Aug 6, 2026
748ee13
feat(world): make the rail back button step out of a realm first (#6447)
idoshamun Aug 6, 2026
d0351f6
feat(world): a lofi bed while you are riding a bird (#6449)
idoshamun Aug 6, 2026
2339c82
fix(profile): 404 unknown profiles instead of 200 (#6448)
idoshamun Aug 6, 2026
b0f7a76
feat(world): level progress on the plates, and events for the loop (#…
idoshamun Aug 6, 2026
45e9d3d
feat(post): surface the questions a post answers to answer engines (#…
idoshamun Aug 6, 2026
95899aa
feat(post): show the answered questions FAQ to anonymous readers (#6452)
idoshamun Aug 6, 2026
263339d
fix(seo): render prerendered content instead of an empty document (#6…
idoshamun Aug 6, 2026
6c8429a
fix: layout v2 sidebar links in extension
capJavert Aug 7, 2026
0d273ea
fix: paint prerendered content before boot (#6454)
capJavert Aug 7, 2026
a31451f
feat(feeds): A/B clustered tag-chip feed seeding (#6427)
capJavert Aug 7, 2026
70b0c31
feat(wallet): link transaction counterparts to their profile (#6457)
capJavert Aug 7, 2026
7acc42d
fix: show gift messages in the wallet transaction row (#6458)
capJavert Aug 7, 2026
82bb029
feat(ads): move the ad_only card links into an options menu on the gl…
tsahimatsliah Aug 11, 2026
bff88e1
feat(storybook): ad card review pages, plus two ad card fixes they su…
tsahimatsliah Aug 11, 2026
83cb470
chore(giveback): close the campaign (#6464)
idoshamun Aug 11, 2026
0ee521d
fix(world): one open signup per world visit, attributed to the world …
idoshamun Aug 11, 2026
28a0141
feat(world): open a district's upvote feed when you click it (#6466)
idoshamun Aug 12, 2026
66c3b31
feat(world): filter a district's upvote feed by niche id (#6467)
idoshamun Aug 12, 2026
b093343
fix(layout-v2): stop the announcement bar covering the top of the app…
tsahimatsliah Aug 12, 2026
024756e
feat(tags): add notification subscribe to the tag page (#6460)
tsahimatsliah Aug 12, 2026
8ce58b8
chore(cards): remove the feed_card_glass_actions experiment (#6470)
tsahimatsliah Aug 12, 2026
9331f8e
feat(world): render the district level-up notification (#6469)
idoshamun Aug 12, 2026
c1836b1
feat(world): its own notification toggle instead of the achievements …
idoshamun Aug 12, 2026
dffb9dd
feat(world): explain the place to somebody seeing it for the first ti…
idoshamun Aug 12, 2026
beca166
fix(typography): stop remounting on every render (#6475)
idoshamun Aug 12, 2026
250b125
feat(world): a first-visit sequence, and an explanation on phones (#6…
idoshamun Aug 12, 2026
7636639
feat: add agent markdown signup wall (#6471)
capJavert Aug 13, 2026
553bcc4
feat: unify first-slot CTAs, fix ad-slot displacement + placement mat…
capJavert Aug 13, 2026
baeaf74
feat(world): open the world index on /world (#6477)
idoshamun Aug 13, 2026
15aa2a4
feat: canonicalize own profile URL (#6478)
capJavert Aug 13, 2026
27a92ed
feat(world): put a whole field's leaderboard on the index (#6479)
idoshamun Aug 13, 2026
65f5fa3
fix(world): let the follow section grow, and stop it clipping (#6480)
idoshamun Aug 13, 2026
c1b58fc
feat(world): fetch more followed worlds instead of stopping at fifty …
idoshamun Aug 13, 2026
75958e0
feat(world): give the index somewhere to be found from (#6482)
idoshamun Aug 13, 2026
9c00769
chore: remove daily homepage feature (#6476)
capJavert Aug 13, 2026
26d4779
feat(plus): flag-gated 50% off summer sale (#6468)
nimrodkra Aug 14, 2026
25edf11
feat(plus): surface the full Plus plan on the checkout page (#6483)
nimrodkra Aug 14, 2026
d987e3f
feat: add Google AdSense seller record to ads.txt (#6485)
nimrodkra Aug 16, 2026
1531291
feat(analytics): log server-side page requests from the proxy (#6484)
capJavert Aug 17, 2026
1e54c71
fix(webapp): exclude static assets from proxy logging (#6488)
capJavert Aug 17, 2026
1a7ef93
feat(notifications): add agent filter category behind interest_agent …
capJavert Aug 17, 2026
90686df
fix: roll out notifications redesign (#6489)
rebelchris Aug 18, 2026
349ee52
refactor: agent -> agents notification category
capJavert Aug 18, 2026
4796e24
fix: agents label
capJavert Aug 18, 2026
be2b55b
feat: streak milestone offers experiment (split/spotlight popup) (#6487)
rebelchris Aug 18, 2026
25c7445
fix(cookies): one-click consent on the iubenda banner (#6493)
pnvasanth Aug 18, 2026
a1e621f
build(extension): version 3.46.7
rebelchris Aug 18, 2026
36bd81b
fix: gate shortcuts onboarding card on async data to prevent flash
capJavert Aug 18, 2026
ab11ee2
fix: resolve Mazatlan timezone correctly (#6495)
rebelchris Aug 18, 2026
b5350b8
feat: remove post signup activation flag (#6496)
rebelchris Aug 19, 2026
e40d9b8
feat: tool landing pages and /tools directory (#6437)
rebelchris Aug 19, 2026
05a90e6
feat(cookies): align the iubenda banner with the marketing sites' con…
tsahimatsliah Aug 20, 2026
590f93f
feat: official source, alternatives, and verified-only discussion on …
rebelchris Aug 20, 2026
067a912
feat(agent): split-screen agent workspace wired to the interest histo…
capJavert Aug 20, 2026
60349c5
fix(agent): drop the generic Working fallback from the thinking strip…
capJavert Aug 20, 2026
80593a6
fix(agent): open a run's feed link with its own findings (#6502)
capJavert Aug 20, 2026
bd4a720
feat(agent): show the LLM-generated interest title across the workspace
capJavert Aug 20, 2026
05d1181
feat(agent): render the summary post as the reply and open post links…
capJavert Aug 20, 2026
6401b08
fix(agent): resolve id-style post links in reply text
capJavert Aug 21, 2026
61553af
feat(interests): post reference markers in agent chat (#6504)
capJavert Aug 21, 2026
74e7be6
feat(agent): pick agent settings on the spawn screen (#6505)
capJavert Aug 21, 2026
a59922a
fix(agent): double scrollbar on layout v2
capJavert Aug 21, 2026
cd198ce
feat: add tool claim UI to the tool page (#6501)
rebelchris Aug 21, 2026
412d322
feat: show community take on the legacy post layout (#6507)
rebelchris Aug 21, 2026
e05409d
fix(agent): open transcript post links in the side pane by fetching o…
capJavert Aug 22, 2026
53a3b62
perf(agent): slim the findings query to what the UI reads
capJavert Aug 22, 2026
83b1116
fix(shared): show pending state while deleting squads (#6506)
rebelchris Aug 22, 2026
81ba413
fix(shared): give the 404 somewhere to go (#6509)
nimrodkra Aug 23, 2026
a4759e9
fix: open shared articles in reader (#6511)
idoshamun Aug 23, 2026
6b551d1
fix(post): open the source article from the cover image and title (#6…
tsahimatsliah Aug 24, 2026
83809cf
feat(proxy): add referer and language to events
capJavert Aug 24, 2026
41559c1
fix(agent): hide hover-reveal card actions on touch devices
capJavert Aug 24, 2026
a5db478
feat(agent): scroll and highlight the notified run in the workspace (…
capJavert Aug 24, 2026
1e309d1
fix(cards): free the impressions slot and fit the feed action bar to …
tsahimatsliah Aug 24, 2026
19bfa63
fix: show community takes in post modals (#6520)
rebelchris Aug 24, 2026
2306a92
feat(pixels): add Quora Pixel tracking (#6521)
pnvasanth Aug 25, 2026
d5e3dd5
docs: remove obsolete public local setup (#6525)
idoshamun Aug 25, 2026
eda87af
fix(agent): defer the run deep-link scroll until findings load
capJavert Aug 25, 2026
e63c2c0
fix(cookies): stop the LGPD banner from showing worldwide (#6524)
pnvasanth Aug 25, 2026
e1e5a3f
feat(webapp): ad-monetised post template for paid and SEO traffic (#6…
rebelchris Aug 25, 2026
5634b6a
chore: expand ads.txt with additional entries
idoshamun Aug 25, 2026
549ba54
fix(agent): re-focus deep-linked runs across history navigation
capJavert Aug 25, 2026
57aaf54
fix: render community takes in feed-opened post modals (#6523)
rebelchris Aug 25, 2026
61afd3f
feat: gate jobs UI behind feature flag (#6519)
rebelchris Aug 25, 2026
7f2c66f
feat(shared): user-level AdSense impression and click analytics (#6526)
rebelchris Aug 25, 2026
7d1b373
chore: agent off default
capJavert Aug 25, 2026
7c0576a
feat: agent focused item
capJavert Aug 25, 2026
09f956d
Merge remote-tracking branch 'origin/main' into dev-take-pic
tomeredlich Aug 25, 2026
c395381
feat(snapshot): square share images for every daily.dev surface
tomeredlich Aug 26, 2026
485b644
chore(snapshot): name the button page for what it shows
tomeredlich Aug 30, 2026
d7eac63
docs(snapshot): map every share surface to the action that should lead
tomeredlich Aug 30, 2026
20c70d8
docs(snapshot): say which action leads on each button placement
tomeredlich Aug 30, 2026
6cbf174
docs(snapshot): show the recommended control set on each placement
tomeredlich Aug 30, 2026
e945200
docs(snapshot): show only the action that leads each surface
tomeredlich Aug 30, 2026
3225ba5
feat(snapshot): lead with one share action, tuck the rest behind it
tomeredlich Aug 30, 2026
f37b6de
Revert "feat(snapshot): lead with one share action, tuck the rest beh…
tomeredlich Aug 30, 2026
3874b0e
docs(snapshot): preview every surface the sharing map covers
tomeredlich Aug 30, 2026
0406af0
docs(snapshot): show the real selection bar on placement 8
tomeredlich Aug 30, 2026
0691a5f
docs(snapshot): show every control the placements use
tomeredlich Aug 30, 2026
7764bf2
feat(snapshot): confirm a capture, and make the toast visible in review
tomeredlich Aug 30, 2026
2bd3fea
feat(snapshot): copy the image instead of downloading it
tomeredlich Aug 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,9 @@ figma-images/
*.tsbuildinfo
node-compile-cache/

# Plan files
plans/*.md
# Plan files — the whole subtree, not just the top level: internal strategy
# docs must never reach this public repository at any nesting depth.
plans/
.cursor/plans/

# Claude Code runtime state (hooks/skills/settings remain tracked)
Expand Down
44 changes: 0 additions & 44 deletions .gitpod.yml

This file was deleted.

11 changes: 0 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,17 +62,6 @@ contains a collection of smaller projects or libraries that are used across the

The web app project. This is a Next.js project and has more pages than the extension, such as a registration page, post page, profile page, etc. For more information [click here](https://github.com/dailydotdev/apps/tree/master/packages/webapp).

## Local Environment

To spin up a local environment, you will need Docker. Do the steps below and you should be able to start trying to center a div:

- Fork this repo
- Pull it locally
- Run `docker compose up`
- Once done, seed your local data by running `docker compose exec daily-api node ./bin/import`
- Then lastly, run npm run dev:oss
- The app should run at `http://localhost:5002/`

## Want to Help?

So you want to contribute to daily.dev app suite and make an impact, we are glad to hear it. :heart_eyes:
Expand Down
2 changes: 1 addition & 1 deletion packages/extension/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "extension",
"version": "3.46.5",
"version": "3.46.7",
"scripts": {
"dev": "cross-env NODE_ENV=development cross-env TARGET_BROWSER=chrome rspack build -c rspack.config.js --watch",
"build": "cross-env NODE_ENV=production cross-env TARGET_BROWSER=chrome rspack build -c rspack.config.js",
Expand Down
30 changes: 24 additions & 6 deletions packages/extension/src/newtab/ExtensionTopBanners.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { TopHero } from '@dailydotdev/shared/src/components/marketing/banners/He
import { useReadingReminderHero } from '@dailydotdev/shared/src/hooks/notifications/useReadingReminderHero';
import {
fileValidation,
uploadCvOpportunitySuccessContent,
uploadCvProfileSuccessContent,
useUploadCv,
} from '@dailydotdev/shared/src/features/profile/hooks/useUploadCv';
import { useLazyModal } from '@dailydotdev/shared/src/hooks/useLazyModal';
Expand All @@ -23,6 +25,7 @@ import {
cloudinaryShortcutsIconsReddit,
uploadCvBgMobile,
} from '@dailydotdev/shared/src/lib/image';
import { useJobsFeature } from '@dailydotdev/shared/src/hooks/useJobsFeature';

// Bare-illustration frame matched across the three top cards so they
// line up vertically. Slightly wider than tall to give the CV cluster
Expand Down Expand Up @@ -93,14 +96,20 @@ type UseShortcutsOnboardingResult = {

const useShortcutsOnboarding = (): UseShortcutsOnboardingResult => {
const hubEnabled = useIsShortcutsHubEnabled();
const { showTopSites, toggleShowTopSites } = useSettingsContext();
const { showTopSites, toggleShowTopSites, loadedSettings } =
useSettingsContext();
const { openModal } = useLazyModal();
const { completeAction, checkHasCompleted } = useActions();
const { shortcutLinks } = useShortcutLinks();
const { completeAction, checkHasCompleted, isActionsFetched } = useActions();
const { shortcutLinks, hasCheckedPermission } = useShortcutLinks();

const hasShortcuts = (shortcutLinks?.length ?? 0) > 0;
const hasClosedBanner = checkHasCompleted(ActionType.ClosedShortcutsBanner);
const shouldShow = !hasShortcuts && !hasClosedBanner;
const shouldShow =
isActionsFetched &&
loadedSettings &&
!!hasCheckedPermission &&
!hasShortcuts &&
!hasClosedBanner;

const completeFirstSession = () => {
if (!checkHasCompleted(ActionType.FirstShortcutsSession)) {
Expand Down Expand Up @@ -130,7 +139,12 @@ export const ExtensionTopBanners = (): ReactElement | null => {
// new tabs, which is where the extension lives).
const reminder = useReadingReminderHero({ requireMobile: false });
const { isLoggedIn, isAuthReady } = useAuthContext();
const { onUpload, shouldShow: shouldShowCv } = useUploadCv();
const { isJobsEnabled } = useJobsFeature();
const { onUpload, shouldShow: shouldShowCv } = useUploadCv({
modalContent: isJobsEnabled
? uploadCvOpportunitySuccessContent
: uploadCvProfileSuccessContent,
});
const { completeAction } = useActions();
const fileInputRef = useRef<HTMLInputElement>(null);
const shortcuts = useShortcutsOnboarding();
Expand Down Expand Up @@ -164,7 +178,11 @@ export const ExtensionTopBanners = (): ReactElement | null => {
cards.push(
<TopHero
key="cv"
subtitle="Upload your CV and let your next job quietly come to you."
subtitle={
isJobsEnabled
? 'Upload your CV and let your next job quietly come to you.'
: 'Upload your CV to autofill your profile in seconds.'
}
ctaLabel="Upload CV"
illustration={<CvIllustration />}
onCtaClick={() => fileInputRef.current?.click()}
Expand Down
82 changes: 34 additions & 48 deletions packages/extension/src/newtab/MainFeedPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ import { SearchProviderEnum } from '@dailydotdev/shared/src/graphql/search';
import { LogEvent } from '@dailydotdev/shared/src/lib/log';
import { useLogContext } from '@dailydotdev/shared/src/contexts/LogContext';
import { useFeedLayout } from '@dailydotdev/shared/src/hooks';
import { useDailyPage } from '@dailydotdev/shared/src/hooks/feed/useDailyPage';
import { DailyHome } from '@dailydotdev/shared/src/features/daily/DailyHome';
import { useLayoutVariant } from '@dailydotdev/shared/src/hooks/layout/useLayoutVariant';
import { useShortcutLinks } from '@dailydotdev/shared/src/features/shortcuts/hooks/useShortcutLinks';
import { useDndContext } from '@dailydotdev/shared/src/contexts/DndContext';
Expand Down Expand Up @@ -84,9 +82,6 @@ const MainFeedPageInner = ({
useCompanionSettings();
const { isActive: isDndActive, showDnd, setShowDnd } = useDndContext();
const { isCustomDefaultFeed } = useCustomDefaultFeed();
const { isDailyAsDefault, setShowDaily } = useDailyPage();
const showDailyHome =
feedName === 'default' && !isSearchOn && isDailyAsDefault;

useLayoutEffect(() => {
if (!initialPage || !shouldInitializeCurrentPage) {
Expand Down Expand Up @@ -180,49 +175,40 @@ const MainFeedPageInner = ({
}
>
<FeedLayoutProvider>
{showDailyHome ? (
<DailyHome
onBackToFeed={() => {
setShowDaily(false);
window.scrollTo({ top: 0 });
}}
/>
) : (
<MainFeedLayout
feedName={feedName}
isSearchOn={isSearchOn}
searchQuery={searchQuery}
onNavTabClick={onNavTabClick}
searchChildren={
<PostsSearch
onSubmitQuery={async (query, extraFlags) => {
logEvent({
event_name: LogEvent.SubmitSearch,
extra: JSON.stringify({
query,
provider: SearchProviderEnum.Posts,
...extraFlags,
}),
});

setSearchQuery(query);
}}
onFocus={() => {
logEvent({ event_name: LogEvent.FocusSearch });
}}
/>
}
shortcuts={
isV2
? undefined
: shortcuts ?? (
<ShortcutLinks
shouldUseListFeedLayout={shouldUseListFeedLayout}
/>
)
}
/>
)}
<MainFeedLayout
feedName={feedName}
isSearchOn={isSearchOn}
searchQuery={searchQuery}
onNavTabClick={onNavTabClick}
searchChildren={
<PostsSearch
onSubmitQuery={async (query, extraFlags) => {
logEvent({
event_name: LogEvent.SubmitSearch,
extra: JSON.stringify({
query,
provider: SearchProviderEnum.Posts,
...extraFlags,
}),
});

setSearchQuery(query);
}}
onFocus={() => {
logEvent({ event_name: LogEvent.FocusSearch });
}}
/>
}
shortcuts={
isV2
? undefined
: shortcuts ?? (
<ShortcutLinks
shouldUseListFeedLayout={shouldUseListFeedLayout}
/>
)
}
/>
</FeedLayoutProvider>
<DndModal isOpen={showDnd} onRequestClose={() => setShowDnd(false)} />
</MainLayout>
Expand Down
40 changes: 40 additions & 0 deletions packages/shared/__tests__/fixture/post.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,46 @@ const post: Post = {
type: PostType.Article,
};

export const postWithCommunitySentiment: Post = {
...post,
communitySentiment: {
breakdown: { positive: 62, mixed: 24, critical: 14 },
tldr: 'Most agree it is worth reading.',
postCount: 2,
sources: ['Hacker News', 'Lobsters'],
pros: ['Clear explanation'],
cons: ['Skips some trade-offs'],
bySource: [
{
source: 'Hacker News',
lean: 'positive',
note: 'Mostly supportive',
url: 'https://news.ycombinator.com/item?id=1',
},
],
hottestDebate: 'Whether the advice applies broadly.',
openQuestions: ['How does it behave at scale?'],
highlights: [
{
quote: 'This helped clarify the trade-off.',
author: 'someone',
source: 'Hacker News',
url: 'https://news.ycombinator.com/item?id=2',
metrics: { points: 214, replies: 88 },
},
],
discussions: [
{
provider: 'hackernews',
url: 'https://news.ycombinator.com/item?id=1',
points: 214,
commentsCount: 88,
},
],
updatedAt: '2026-07-18T00:00:00.000Z',
},
};

export const sharePost: Post = {
id: '5nLQHVNHi',
title: 'Good read about react-query',
Expand Down
28 changes: 28 additions & 0 deletions packages/shared/__tests__/helpers/media.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// The global stub in `setup.ts` never matches and carries only the legacy
// `addListener`, which libraries calling `addEventListener` blow up on.
export const mockMatchMedia = (
matches: (query: string) => boolean = () => false,
): void => {
(global.matchMedia as jest.Mock).mockImplementation((query: string) => ({
media: query,
matches: matches(query),
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
addListener: jest.fn(),
removeListener: jest.fn(),
dispatchEvent: jest.fn(),
onchange: null,
}));
};

export const laptopQuery = '(min-width: 1020px)';
export const noHoverQuery = '(hover: none)';

// A 1020px window matches every width breakpoint at or below laptop, so
// answering only the laptop query reports a desktop that is not a tablet.
export const mockDesktop = (): void =>
mockMatchMedia((query) => {
const [, min] = /min-width:\s*(\d+)px/.exec(query) ?? [];

return !!min && Number(min) <= 1020;
});
1 change: 1 addition & 0 deletions packages/shared/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@
"@tiptap/react": "^3.22.5",
"@tiptap/starter-kit": "^3.22.5",
"@zumer/snapdom": "^2.23.1",
"border-beam": "1.3.0",
"check-password-strength": "^2.0.10",
"cmdk": "^1.0.0",
"edge-aura": "0.6.0",
Expand Down
Loading
Loading