
Research
Supply Chain Attack on Axios Pulls Malicious Dependency from npm
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.
@follow-app/client-sdk
Advanced tools
The official JavaScript/TypeScript client for Folo - the modern RSS reader. This SDK makes it easy to build applications that interact with Folo's RSS management, reading history, and AI-powered features.
pnpm add @follow-app/client-sdk
import { FollowClient } from '@follow-app/client-sdk'
// Connect to Folo
const follow = new FollowClient({
baseURL: 'https://api.follow.is',
credentials: 'include', // For web apps
})
// Subscribe to an RSS feed
await follow.subscriptions.create({
url: 'https://example.com/rss',
category: 'Technology',
})
// Get your latest unread articles
const articles = await follow.entries.list({
read: false,
limit: 20,
})
// Mark articles as read
await follow.entries.batch.read({
entryIds: articles.data.map((entry) => entry.id),
})
Subscribe to and manage RSS feeds with ease:
// Subscribe to feeds
await follow.subscriptions.create({
url: 'https://blog.example.com/rss',
category: 'Tech Blogs',
})
// Get all your subscriptions
const subscriptions = await follow.subscriptions.get()
// Import OPML files
await follow.subscriptions.import({ opmlContent })
Track and manage your reading:
// Get unread articles
const unread = await follow.entries.list({
read: false,
limit: 50,
})
// Mark articles as read
await follow.entries.batch.read({
entryIds: ['article-1', 'article-2'],
})
// Save articles to inbox
await follow.entries.inbox.add({
entryId: 'article-123',
note: 'Read later',
})
Enhance your reading with AI:
// Get article summaries
const summary = await follow.ai.summary({
id: 'article-123',
})
// Chat with AI about your articles
const response = await follow.ai.chat({
messages: [
{ role: 'user', content: 'What are the key trends in this article?' },
],
})
// Get personalized recommendations
const recommendations = await follow.ai.recommendations()
Understand your reading habits:
// Get reading statistics
const stats = await follow.reads.stats()
// Track feed performance
const feedAnalytics = await follow.feeds.analytics({
feedId: 'feed-123',
})
import { FollowClient } from '@follow-app/client-sdk'
const follow = new FollowClient({
baseURL: 'https://api.follow.is',
credentials: 'include', // For cookie-based authentication
})
import { FollowClient } from '@follow-app/client-sdk'
const follow = new FollowClient({
baseURL: 'https://api.follow.is',
headers: {
Authorization: 'Bearer your-api-token',
},
})
// Or set the token later
follow.setAuthToken('your-api-token')
import { FollowClient } from '@follow-app/client-sdk'
const follow = new FollowClient({
baseURL: 'https://api.follow.is',
credentials: 'include',
headers: {
'User-Agent': 'YourApp/1.0.0',
},
})
The SDK provides clear error handling for common scenarios:
import { FollowAPIError, FollowAuthError } from '@follow-app/client-sdk'
try {
const articles = await follow.entries.list()
} catch (error) {
if (error instanceof FollowAuthError) {
// User needs to log in
console.log('Authentication required')
redirectToLogin()
} else if (error instanceof FollowAPIError) {
// Handle API errors (network, server, etc.)
console.log(`Error: ${error.message}`)
showErrorMessage(error.message)
}
}
import { ExceptionCodeMap } from '@follow-app/client-sdk'
try {
await follow.subscriptions.create({ url: 'invalid-url' })
} catch (error) {
if (error.code === ExceptionCodeMap.feed.NOT_FOUND) {
console.log('Feed not found at that URL')
} else if (error.code === ExceptionCodeMap.subscription.ALREADY_EXISTS) {
console.log('You are already subscribed to this feed')
}
}
// Set up the client
const follow = new FollowClient({
baseURL: 'https://api.follow.is',
credentials: 'include',
})
// Subscribe to feeds
await follow.subscriptions.create({
url: 'https://blog.openai.com/rss/',
category: 'AI & Technology',
})
// Get latest articles
const latest = await follow.entries.list({
read: false,
limit: 20,
})
// Display articles to user, then mark as read
await follow.entries.batch.read({
entryIds: latest.data.map((article) => article.id),
})
// Import existing OPML subscription list
await follow.subscriptions.import({ opmlContent })
// Get articles from specific categories
const techNews = await follow.entries.list({
category: 'Technology',
limit: 100,
read: false,
})
// Filter by keywords
const aiArticles = techNews.data.filter(
(article) =>
article.title.toLowerCase().includes('ai') ||
article.content.toLowerCase().includes('artificial intelligence'),
)
// Save important articles to inbox
for (const article of aiArticles) {
await follow.entries.inbox.add({
entryId: article.id,
note: 'AI trend research',
})
}
// Get user's reading recommendations
const recommendations = await follow.ai.chat({
messages: [
{
role: 'user',
content: 'What are the most important articles I should read today?',
},
],
})
// Get summary of long articles
const longArticles = await follow.entries.list({
read: false,
limit: 10,
})
for (const article of longArticles.data) {
const summary = await follow.ai.summary({
id: article.id,
})
console.log(`${article.title}\nSummary: ${summary.summary}`)
}
MIT License - see LICENSE file for details.
We welcome contributions! Please see our contributing guide for details on:
Made with ❤️ by the Folo team
FAQs
TypeScript client SDK for Follow RSS Server API
The npm package @follow-app/client-sdk receives a total of 457 weekly downloads. As such, @follow-app/client-sdk popularity was classified as not popular.
We found that @follow-app/client-sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 5 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.

Security News
TeamPCP is partnering with ransomware group Vect to turn open source supply chain attacks on tools like Trivy and LiteLLM into large-scale ransomware operations.