{"slug": "smart-feed-filter-tuning-my-rss-digest-with-a-local-jev-like-model-in-ollama", "title": "Smart Feed Filter: Tuning My RSS Digest with a Local JEV-like model in Ollama", "summary": "A developer built Smart Feed Filter, an open-source RSS digest tool that uses a local Ollama-hosted classifier (tev1:0.8b, with tev1:4b as fallback) to score feed items against user-defined category profiles and surface a 72-hour digest grouped and ranked by category. The system is a filtering engine rather than a summarizer, using templated reasons and a preview-diff-then-atomic-apply flow for retroactive profile edits over the last 14 days. Before building the UI, the developer ran a model gate on a 100-item labeled set scoring macro-F1, precision@10, latency and failures, finding the data-science work profile required more tuning than the off-work profile because topics overlap heavily.", "body_md": "*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady](https://dev.to/challenges/hacktoberfest-week3-2026-10-19)*\n\n**Smart Feed Filter** turns public RSS feeds into a short, category-grouped digest for one person.\n\nThe problem: professionals with RSS still drown in unread items, and generic readers sort by recency while AI summarizers add reading work instead of removing it.\n\nSmart Feed Filter removes the triage step. You define a profile: a small set of categories, each with a name, description, criteria, and weight. A local decision model scores every feed item against those categories. The app shows the last 72 hours grouped by category, ranked inside each category, with tags and (optionally) a one-line reason.\n\nIt's a filtering engine, not a summarizer. No article fetching, no private accounts, no generated prose.\n\nWho gets a little more relaxed, or lazier? The data scientist who wants to skim only ML-method papers and skip hiring/funding noise; the off-work reader who wants hobby content without the feed becoming an everything feed.\n\nSmart Feed Filter's workflow in two steps:\n\n```\nUser defines profile (categories, criteria, weights)\n        │\n        ▼\nManual refresh → fetch → dedupe → store\n        │\n        ▼\nLocal classifier (Ollama) scores new items\n        │\n        ▼\n72h digest grouped by category, ranked by score\n```\n\nHere are screenshots of the running app:\n\n`Low confidence` group and sources\n\n```\n├── app\n│   ├── config.py\n│   ├── db.py\n│   ├── __init__.py\n│   ├── logging_config.py\n│   ├── __main__.py\n│   ├── main.py\n│   ├── routes/\n│   ├── schema.sql\n│   ├── seed.py\n│   ├── services/\n│   ├── static/\n│   ├── templates/\n│   ├── timeutil.py\n│   └── versioning.py\n├── data\n│   └── feedfilter.db\n├── eval/\n├── profiles\n│   ├── catalog.yaml\n│   ├── ds.v1.yaml\n│   └── fun.v1.yaml\n├── pyproject.toml\n├── requirements.txt\n├── spec.md\n└── tests/\n```\n\n`tev1:0.8b` (fallback `tev1:4b`), POST /v1/systemone. `ollama serve`, `ollama pull tev1:0.8b`), retry classifies only missing.\nReasons are templated, never generated. Ranking handles ordering. Retroactive edits use a preview-diff-then-atomic-apply flow over the last 14 days; weight edits reorder without model calls, threshold edits re-filter cached probabilities.\n\nBefore building UI, I ran a model gate via `python eval/harness.py --gate`: a 100-item labeled set (50 per profile) scored on macro-F1, precision@10, latency, and failures. The local `tev1:0.8b` model passed my selection after category and threshold tuning; fallback `tev1:4b` documented.\n\nCategorizing work content was (is?) harder than off-work (fun) content because real-world topics overlap heavily (ML methods vs. LLM apps vs. MLOps vs. experimentation), which is exactly why the spec encodes separate criteria fields and why `ds.v1` needed more tuning cycles than the fun profile.\n\nHere is the sample of `ds.v1` profile:\n\n```\nid: ds.v1\nname: Data Scientist\nkind: work\nversion: 1\nthreshold: 0.62\nmax_categories: 16\nseed: true\ndescription: >\n  Professional reading profile for data scientists and ML practitioners.\n  Prefers methods, production practice, analytics, and responsible AI over\n  general technology news, hiring, funding, and product marketing.\nexclude_hints:\n  - hiring, recruiting, and career advice\n  - funding, acquisitions, and business news\n  - consumer gadgets and general technology policy\n  - health or medical advice\ncategories:\n  - id: ml-research\n    name: ML Methods & Research\n    description: >-\n      New machine-learning methods, architectures, training techniques,\n      benchmarks, or results from research papers and research labs.\n    criteria_true: >-\n      The item reports or analyzes a machine-learning method, model, benchmark,\n      training technique, or research finding.\n    criteria_false: >-\n      The item is product news, production operations, business news, career\n      advice, or not about machine-learning methods.\n    reason_hint: covers methods, architectures, benchmarks, or research findings\n    weight: 1.3\n    enabled: true\n```\n\nEach category can be enabled/disabled. So for example you can be interested in some topic like \"Responsible AI & Evaluation\", and after getting enough valuable information just turn it off - until you need it again. Similarly with job search and vacancies - your `job-search` profile can include categories for different positions with their own criteria.\n\nOpen innovation made this build possible in a way a closed API never could. The intelligence here isn't a black box you call — it's a local model plus an open taxonomy loop: versioned category criteria, eval harness, gate, threshold tuning, and preview diffs. Opening the criteria (`criteria_true` / `criteria_false`, reason hints) meant the taxonomy itself became community- and maintainer-editable, versioned via hash.\n\nAnd because the model runs locally on an open-weight model via Ollama - local-first means no vendor lock-in. Privacy wasn't an afterthought — it was the architecture: no API key, no telemetry, nothing leaving the machine except public feed requests. Open source made that stack reproducible.", "url": "https://wpnews.pro/news/smart-feed-filter-tuning-my-rss-digest-with-a-local-jev-like-model-in-ollama", "canonical_source": "https://dev.to/dmytrovoytko/smart-feed-filter-tuning-my-rss-digest-with-a-local-jev-like-model-in-ollama-827", "published_at": "2026-10-25 18:39:33+00:00", "updated_at": "2026-10-25 18:42:53.421077+00:00", "lang": "en", "topics": ["ai-tools", "machine-learning", "large-language-models", "ai-products"], "entities": ["Ollama", "Smart Feed Filter", "Hacktoberfest", "tev1:0.8b", "tev1:4b"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/smart-feed-filter-tuning-my-rss-digest-with-a-local-jev-like-model-in-ollama", "markdown": "https://wpnews.pro/news/smart-feed-filter-tuning-my-rss-digest-with-a-local-jev-like-model-in-ollama.md", "text": "https://wpnews.pro/news/smart-feed-filter-tuning-my-rss-digest-with-a-local-jev-like-model-in-ollama.txt", "jsonld": "https://wpnews.pro/news/smart-feed-filter-tuning-my-rss-digest-with-a-local-jev-like-model-in-ollama.jsonld"}}