name: add-company-news description: Use when the user asks to add, backfill, index, classify, or verify news for a specific dcbuilder.dev portfolio company page such as /news/morpho, /news/megaeth, or a company timeline/history page.
Add Company News Skill
Use this skill for company-specific timeline pages at /news/<company-slug>.
For raw DB insert mechanics, also use the post-news skill.
Mental Model
Company pages are not separate tables. They are filtered timeline views over the existing news feed:
- Canonical route:
/news/<company-slug>such as/news/morpho - Legacy route:
/news/company?company=Morphoredirects throughsrc/proxy.ts - Slug helper:
src/lib/portfolio-news.ts - Company matching and timeline sorting:
src/lib/company-news.ts - Timeline UI:
src/components/CompanyTimeline.tsx - Source tables:
announcementsandcurated_links - General
/newsexcludes portfolio-company timeline items; company pages callgetAllNews({ includeCompanyTimelineNews: true })to opt into them.
Choose The Record Type
Use an announcement when the news is official company communication:
- Official X post from the company
- Company blog post
- GitHub release or official repo announcement
- Product, adoption, funding, launch, or roadmap announcement
Use a curated link when the source is not official company communication:
- External article about the company
- Individual post, analyst thread, ecosystem commentary
- Research or press that should appear in
/newsbut is not owned by the company
For company timeline pages, prefer announcements when in doubt and the source is official.
Required Fields
For an announcement:
title: concise milestone titleurl: canonical source URLcompany: exact portfolio company name frominvestments.titleplatform:x,blog,github,discord, orotherdate: actual publication/event date asYYYY-MM-DD, not the date the item is backfilled into dcbuilder.devcategory: topical category, not necessarily the sourcedescription: direct event summary
For a curated link:
titleurlsource: source name that can map to the portfolio companydatecategorydescription
Category Rules
Use these current news categories:
| Value | Label | Use For |
|---|---|---|
x_post |
X Post | The item itself is mainly an X post with no better topical category |
product |
Product | Product launches, new features, app releases |
defi |
DeFi | DeFi protocol mechanics, markets, lending, trading |
crypto |
Crypto | Broad crypto/network/token news |
ai |
AI | AI agents, models, automation |
infrastructure |
Infrastructure | Infra, devtools, protocol/platform updates |
research |
Research | Papers, whitepapers, technical research |
funding |
Funding | Fundraises, grants, token sale/fundraising events |
general |
General | Fallback only |
Timeline cards can show multiple badges. For example, an announcement with
platform: "x" and category: "product" displays X Post and Product.
Do not force every X-sourced announcement to category: "x_post" if a better
topical category exists.
Description Style
Write descriptions as milestones, not attribution blurbs.
- Good:
Morpho Agents [Beta] launches as an AI-agent-native lending interface through Base MCP. - Good:
The Ethereum Foundation increased its treasury allocation to Morpho, while additional institutions expanded yield offerings with Morpho. - Avoid:
Morpho tweeted that agents are now available.
Workflow
- Resolve the company by checking
investments.title. - Confirm the canonical page slug with
getPortfolioNewsUrl(company). - Decide announcement vs curated link.
- Pick
platformand topicalcategory. - Check for duplicate
urlin the target table before inserting. - Insert locally/runtime and, unless told otherwise, mirror to production per
post-news. - Verify the company page, not just
/news:
curl -sS -o /tmp/company-news.html -w '%{http_code}\n' 'http://localhost:3000/news/morpho'
- Browser-check the timeline card includes the expected badges, date, title, and description.
- Confirm the item does not appear on the general
/newspage unless it is a dcbuilder site announcement.
Useful Checks
List a company timeline from the aggregated feed:
bun -e "
import { getAllNews } from './src/lib/news.ts';
import { filterNewsByCompany } from './src/lib/company-news.ts';
const news = await getAllNews();
console.log(JSON.stringify(
filterNewsByCompany(news, 'Morpho').map(({ title, type, platform, category, date, url }) => ({
date, type, platform, category, title, url
})),
null,
2
));
"
Check an announcement by URL:
bun -e "
import { db, announcements } from './src/db';
import { eq } from 'drizzle-orm';
const url = 'SOURCE_URL';
console.log(await db.select().from(announcements).where(eq(announcements.url, url)));
"
Done Criteria
/news/<company-slug>returns200- Portfolio-company timeline items are hidden from the general
/newspage - The item appears in the vertical timeline in reverse chronological order, newest first
- The card displays source badge plus topical category when relevant
- The category dropdown contains the topical category
- Search can find the item by title or description
- The newest/oldest sort toggle preserves correct date ordering
bunx tsc --noEmitpassesbun run lintpasses or only shows known unrelated warnings