Folo is an RSS reader rebuilt for the way people follow things now. Blogs, news sites, newsletters, podcasts, YouTube channels and social feeds all land in one timeline, each shown in a layout that suits it, and you can subscribe to sites without a feed through thousands of RSSHub routes. Newsletters get their own inbox address, and OPML import brings over your subscriptions from any other reader.
The AI is what made it take off. Timeline Summary turns hundreds of new entries into one digest, any article can be summarised or translated side by side into English, Chinese, Japanese or French, and you can ask questions of an article, a folder or everything you follow, with your own API key if you prefer. Scheduled AI tasks write daily or weekly briefings and send them to chat or email, and Actions filter, star, rewrite or forward new entries by rules. It reads articles aloud, syncs across web, desktop and mobile, and sends items to Obsidian, Readwise, Zotero and other tools.
It is AGPL-3.0, with about 39,100 stars and 158 contributors, at desktop v1.16.0 when scanned. The repository holds the apps; accounts, sync and the AI features run through Folo's hosted service.
- Repository: github.com/RSSNext/Folo
- Licence: AGPL-3.0 (GNU Affero General Public License v3.0)
- Language: TypeScript. Stars: 39.1K. Forks: 2,136. Last push: Oct 20, 2026.
- Scan: safe, Oct 22, 2026, commit 84692b5
Who it is for
Heavy readers who follow dozens of sources and want a daily digest instead of a wall of unread items, people moving off Feedly or Inoreader, and researchers who want AI summaries and translation of what they follow.
Getting started
1. Use it in the browser
open https://app.folo.is2. macOS with Homebrew (community cask; Windows, Linux and mobile builds are on the releases page and app stores)
brew install --cask foloSign in, then import an OPML file from your old reader or search for feeds and RSSHub routes inside the app. Anonymous usage data is on by default and can be switched off in the app's settings.
Safety scan
We cloned RSSNext/Folo at commit 84692b5 on Oct 22, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.
- No real secrets across 3,863 files and about 357,000 lines of TypeScript. The three hits are a Firebase web configuration key, which is public by design, the same kind of key in the Android build config, and the PEM header strings in a function that reads a signing key from the environment.
- Analytics: the client includes a tracker with a PostHog adapter and Firebase configuration, and the sendAnonymousData setting defaults to on in the desktop and mobile apps. The hosts in the code are mostly Folo's own (api.folo.is, app.folo.is, ota.folo.is) plus the app stores.
- 283 known advisories (10 critical) in the single pnpm-lock.yaml that covers the desktop, mobile, web and landing apps and all their build and test tooling. The criticals include Handlebars, shell-quote, tinypool and Next.js, which appears only as a peer dependency of UI and auth libraries, not as a server you run. The released apps are signed: Apple notarisation, SignPath for Windows, and GitHub artifact attestations.
- The root postinstall script builds internal packages for people developing Folo; installing the apps does not run it.
- 16 workflows, none using pull_request_target; only 1 of 33 third-party actions is pinned to a commit. Security policy, Dependabot, licence and contributing guide present; no CodeQL.
What the scanner counted
| Check | Result |
|---|---|
| Secrets | 3 candidates found and read; see the notes above. |
| Suspicious code | None found. |
| Install-time code | 2 npm lifecycle scripts. 1 installer script |
| Committed binaries | None. |
| CI workflows | 16 workflows. None use pull_request_target. 32 of 33 third-party actions pinned to a tag rather than a commit. |
| Network hosts | 40 distinct hosts referenced from source; most often github.com, ota.folo.is, api.folo.is, apps.apple.com. No URLs to bare IP addresses. |
| Known vulnerabilities | 283 advisories across 3,654 pinned packages: 10 critical, 150 high, 98 moderate, 25 low. pnpm-lock.yaml: 3,654 packages, 283 advisories. |
| Project hygiene | Has security policy, automated dependency updates, licence file, contributing guide. Missing CodeQL. |
| OpenSSF Scorecard | Not scored: the project is not in Scorecard's weekly index. |
The raw findings
Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.
Secret candidates (3, redacted)
| Where | Rule | Match |
|---|---|---|
| apps/mobile/build/google-services.json:23 | google-api-key | AIzaSy…7Fs (39 chars) |
| apps/ota/src/lib/code-signing.ts:95 | private-key | -----B…--- (27 chars) |
| packages/internal/shared/src/env.common.ts:2 | google-api-key | AIzaSy…Lvo (39 chars) |
npm lifecycle scripts (2)
package.jsonpostinstall:pnpm run build:packagespackage.jsonprepare:simple-git-hooks && corepack prepare
Installer scripts (1)
- scripts/run-proxy.sh, 40 lines
Worst known vulnerabilities (24 of 283)
| Advisory | Severity | Package | Summary |
|---|---|---|---|
| GHSA-2w6w-674q-4c4q | critical | handlebars@4.7.8 | Handlebars.js has JavaScript Injection via AST Type Confusion |
| GHSA-8r5x-fm3f-whwj | critical | handlebars@4.7.8 | Handlebars: JavaScript Injection via AST Type Confusion in compile (bypass of CVE-2026-33937) |
| GHSA-p8wg-vrv2-v86f | critical | handlebars@4.7.8 | Handlebars: JavaScript Injection via Own Property Check Bypass |
| GHSA-2xp9-vwfh-vxw4 | critical | next@16.0.11 | Next.js: Unauthenticated Remote Code Execution in Image Optimization API when AVIF files are used |
| GHSA-p293-qw3h-jr36 | critical | next@16.0.11 | Next.js: Unauthenticated Remote Code Execution on windows-hosted servers |
| GHSA-p6vx-979v-rg4c | critical | seroval@1.5.6 | Seroval: `fromJSON()` Promise thenable assimilation invokes plugin-produced callables (bypass of GHSA-mv8w-475r-vwqw) |
| GHSA-w7jw-789q-3m8p | critical | shell-quote@1.8.3 | shell-quote quote() does not escape newlines in object .op values |
| GHSA-23hp-3jrh-7fpw | critical | tar@6.2.1 | node-tar: Decompression/parse DoS via unlimited input |
| GHSA-5gmw-xhrv-c9v3 | critical | tinypool@2.1.0 | Tinypool: Prototype Pollution gadget in worker options leads to Remote Code Execution |
| GHSA-85c8-ppgw-ccpr | critical | tinypool@2.1.0 | Tinypool: Prototype Pollution Gadget to RCE in run() options |
| GHSA-fv7c-fp4j-7gwp | high | @babel/plugin-transform-modules-systemjs@7.29.0 | @babel/plugin-transform-modules-systemjs generates arbitrary code when compiling malicious input |
| GHSA-x8mw-p69m-v3mx | high | @fastify/busboy@2.1.1 | @fastify/busboy vulnerable to Denial of Service via prototype-named multipart part header |
| GHSA-m9gg-hp2v-232j | high | @grpc/grpc-js@1.9.16 | @grpc/grpc-js: In certain configurations, getAuthContext can return unauthorized certificates as though they were author… |
| GHSA-27p8-2357-5qqv | high | @xmldom/xmldom@0.8.11 | xmldom: DocType `name` Injection Bypasses requireWellFormed |
| GHSA-2v35-w6hq-6mfw | high | @xmldom/xmldom@0.8.11 | xmldom: Uncontrolled recursion in XML serialization leads to DoS |
| GHSA-4w3w-2rp5-g8jm | high | @xmldom/xmldom@0.8.11 | xmldom: Attribute name injection via setAttribute() bypasses requireWellFormed |
| GHSA-8344-3jmq-59r6 | high | @xmldom/xmldom@0.8.11 | xmldom: Quadratic-time attribute deduplication |
| GHSA-93r5-fhx6-vmg9 | high | @xmldom/xmldom@0.8.11 | xmldom: Quadratic-time parsing via the malformed-input recovery path - `parseElementStartPart` re-scan and `normalize()`… |
| GHSA-965w-775f-mr7g | high | @xmldom/xmldom@0.8.11 | xmldom: Quadratic-memory consumption |
| GHSA-c7q8-3ch8-vqpv | high | @xmldom/xmldom@0.8.11 | xmldom: Processing Instruction Target Injection Bypasses requireWellFormed |
| GHSA-f6ww-3ggp-fr8h | high | @xmldom/xmldom@0.8.11 | xmldom has XML injection through unvalidated DocumentType serialization |
| GHSA-j759-j44w-7fr8 | high | @xmldom/xmldom@0.8.11 | xmldom has XML node injection through unvalidated comment serialization |
| GHSA-w2rr-34g9-rvrj | high | @xmldom/xmldom@0.8.11 | xmldom: Element name injection via createElement() bypasses requireWellFormed |
| GHSA-wh4c-j3r5-mjhp | high | @xmldom/xmldom@0.8.11 | xmldom: XML injection via unsafe CDATA serialization allows attacker-controlled markup insertion |
By the numbers
| Stars | 39.1K |
|---|---|
| Forks | 2,136 |
| Contributors | 158 |
| Commits | 7,698 |
| Open issues | 120 |
| Open pull requests | 1 |
| Releases | 123 |
| Latest release | desktop/v1.16.0 |
| Licence | AGPL-3.0 |
| Main language | TypeScript |
| Project age | 2 years |
| Last push | Oct 20, 2026 |
| Tracked files | 3,863 |
| Lines of code | 357.4K |
| Checkout size | 21 MB |
Lines by language: TypeScript 265.6K, JSON 62.4K, Markdown 12.5K, Swift 5,032, YAML 3,669, JavaScript 3,630.
Questions
Is Folo free?
Folo is free to download and use, and its code is open source under the AGPL-3.0. The AI features run through Folo's service, where you can pick a model or bring your own API key.
Can I self-host Folo?
Not fully. This repository contains the web, desktop and mobile apps, but accounts, sync and AI run on Folo's hosted backend at api.folo.is. If you need a reader that runs entirely on your own server, a self-hosted reader such as FreshRSS or Miniflux is the better fit.
How do I move from Feedly or Inoreader to Folo?
Export your subscriptions as an OPML file from your current reader, then import it in Folo's settings. Your feeds and folders come across; read status and saved items from the old service do not.
This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.
