FeedLedger is a daily AI news and paper reporting service.
It scans configurable RSS feeds, filters and summarizes items with AI, stores report history, publishes long-form reports to Notion, and sends delivery links through Telegram. It also includes a built-in Admin Panel + Reader UI for managing settings and browsing previous reports.
- Daily scheduled pipeline per user (scan + send windows)
- AI provider switch:
geminioropenrouter - Multilingual summaries (
en,tr,de,fr,es) - Runtime feed management (enable/disable, group, priority)
- Interest-based grouping (
singleorby_interest) - Special project profiles with dedicated feeds and prompts
- Notion report persistence + optional quota auto-clean
- Telegram link notifications for each report
- Reader API/UI backed by Mammoth (Mongo-compatible local store)
- Multi-user auth with admin role controls
- Node.js + TypeScript (ESM)
- React (Reader frontend bundle)
- Mammoth (embedded/local document store)
- Notion API + Telegram Bot API
- Gemini or OpenRouter models for summarization/relevance
- Node.js
>=18(Node 20 recommended) - npm
- API keys / credentials:
- one AI provider key (
GEMINI_API_KEYorOPENROUTER_API_KEY) NOTION_API_KEYNOTION_PARENT_PAGE_IDTELEGRAM_BOT_TOKENTELEGRAM_CHAT_IDADMIN_PANEL_PASSWORD
- one AI provider key (
git clone <your-repository-url>
cd feedledger
npm install
cp .env.example .env
# edit .env
npm run build
npm start -- --lang=enOpen Admin Panel:
http://127.0.0.1:<PANEL_PORT>(default:8897)
Use the following sequence for a clean environment bring-up after cloning:
- Initialize runtime configuration:
cp .env.example .env-
Set required credentials in
.env:- AI provider key (
GEMINI_API_KEYorOPENROUTER_API_KEY) NOTION_API_KEYNOTION_PARENT_PAGE_IDTELEGRAM_BOT_TOKENTELEGRAM_CHAT_IDADMIN_PANEL_PASSWORD
- AI provider key (
-
Build and start service:
npm install
npm run build
npm start -- --lang=en- Verify control plane:
- Admin Panel:
http://127.0.0.1:<PANEL_PORT>(default:8897) - Authenticate with
adminandADMIN_PANEL_PASSWORD - Configure AI:
- set
Gemini API Keyand/orOpenRouter API Key - choose
Gemini ModelandOpenRouter Model - click
Set Gemini ActiveorSet OpenRouter Active - verify
Active now: ...in AI card
- set
- Confirm feed/topic configuration from dashboard, then click
Save and Apply
- Admin Panel:
Runtime state (data/, logs/, secrets in .env) is environment-specific and remains outside version control.
docker-compose.yml builds a single container that runs both FeedLedger and Mammoth.
cp .env.example .env
# if vendor/mammoth does not exist yet:
git clone --depth 1 https://github.com/MammothEngine/mammoth.git vendor/mammoth
docker compose up -d --buildDefault exposed panel port: 8897.
For operational verification:
docker compose ps
docker compose logs --tail=120AI_PROVIDER(geminioropenrouter)ADMIN_PANEL_PASSWORDNOTION_API_KEYNOTION_PARENT_PAGE_IDTELEGRAM_BOT_TOKENTELEGRAM_CHAT_ID- Provider-specific:
GEMINI_API_KEY(ifAI_PROVIDER=gemini)OPENROUTER_API_KEY(ifAI_PROVIDER=openrouter)
GEMINI_MODEL(default:gemini-2.5-flash)OPENROUTER_MODEL(default:deepseek/deepseek-v3.2-speciale)REPORT_TIMEZONE(default:Europe/Istanbul)DAILY_SCAN_TIME(default:23:45)DAILY_SEND_TIME(default:06:00)REPORT_PERIOD_DAYS(allowed:1,2,3,7,14,30)REPORT_GROUPING_MODE(singleorby_interest)INTEREST_TOPICS(comma-separated)PANEL_HOST(default:127.0.0.1)PANEL_PORT(default:8897)MAMMOTH_ENABLED(default:true)MAMMOTH_URI(default:mongodb://127.0.0.1:27017)MAMMOTH_DATABASE(default:feedledger)
Gemini Modelis selected from curated Gemini presets.OpenRouter Modelis selected from a curated multi-vendor preset list (OpenAI, Anthropic, DeepSeek, Meta, xAI, Mistral, Qwen).Set Gemini ActiveorSet OpenRouter Activeswitches runtime provider immediately for the target user.Save and Applypersists all other panel settings while keeping the current active provider unless explicitly switched.
Full template: .env.example
npm run build- build backend + Reader UInpm run build:server- compile TypeScript servernpm run build:reader- bundleweb/reader-app.tsxnpm run dev- run from source withtsxnpm start- run compiled app (dist/index.js)npm run mammoth:up- clone/build/start Mammoth sidecar stacknpm run docker:up-docker compose up -d --buildnpm run docker:down- stop compose stacknpm run e2e:real- real integration flow scriptnpm run backfill:reader- backfill Reader storage
These paths are generated at runtime and should stay untracked:
data/logs/vendor/mammoth/(local Mammoth checkout)
- A user-level systemd unit is included:
feedledger.service - For server deployment, build first (
npm run build) then runnode dist/index.js - On startup, the app exits if
ADMIN_PANEL_PASSWORDis missing
See CONTRIBUTING.md.
MIT - see LICENSE.
This project is inspired by the original implementation at:
Special thanks to Alican Kiraz for the foundational work and project direction.