Generalized, Sanitized
Published
Winnow
Previously on YouTube Intake: The machine that says no…
I told you I had to watch a lot of YouTube videos. A long-running research project of mine is about discovering new ways to trade things with Open, High, Low, Close and Volume figures. The 0. rule of the project: It will not use the traditional technical analysis tools. Never. AI pulls ideas from the world. Tests ideas. Presents them to me. Part of the ingestion is from YouTube videos. Trading-education YouTube content. The project needed the huge, often click-bait volume filtered and the ideas extracted.
… and now the conclusion
Generalized, Sanitized
Ladies and Gentlemen, here I give you Winnow.
Give it a YouTube link. It tells you what’s in the video that you don’t already know.
Not what the video said. Your run-of-the-mill summarizer can do it just fine. I needed something more time-saving. Because the specialized version did it for Trading-Education, for me.
This one is for you and it tries to tell you whether you needed to watch it, but with intelligence: Does my operator already know what is preached in this video?
A summarizer cannot ask that question. It reads one video and reports what is inside it. Whether the video is worth your hour depends on what you already know. It is blind to your mind so it does the one thing the video’s own description already does: it repeats the content.
Winnow keeps a corpus. The corpus is what you have already watched and read, converted into claims. A new video becomes claims too, and each claim is checked against what is already there. What comes back is the short list: the few claims you have not seen before, and the rest labeled as known so you can see what you would have re-watched for nothing.
A 25-minute talk became a page of claims. Reading them took about two minutes. Watching it would have taken twenty-five. I know there is 1.25x, 1.5x, etc. But sometimes that means you miss things.
What it is
The nagging question: Do you need to watch it, which is actually the question “Is there anything new in there?” That question needs a memory of what you already know, and the memory is the whole point. The verdict is always relative to your corpus, never to the video alone.
Everything except fetching runs on your machine. Extraction, embeddings and judging are local by default and need no API key. Captions come from yt-dlp, which you install and which prints its command before it runs; it is the only thing that reaches the network during a run.
Winnow does not transcribe: a video with no captions is a stop, not a silent empty result. It does not read PDFs. What it reads is plain text, I put in the ones I use: .txt, .md, .markdown, .mdx and subtitle files if you have them, so a transcript you made, documentation, or your own notes go straight in. Anything else you convert first.
What counts as a claim, and what “already known” means, live in a domain pack: a folder with a prompt and a JSON file. One already ships in the repo, for AI-tooling-related videos. Writing your own is configuration, not code, so a pack can stay private and never be published. Everything else in the codebase is domain-blind. That is what makes this one tool rather than one tool per field.
The judgment layer
Local models do the volume. The final call stays with you, or with a frontier model you direct. (Savings people, token savings if you have some hardware to help you)
Judging reads the material three times at three different chunk sizes by default, which sounds wasteful and is not. Different chunk boundaries put different sentences beside each other, so later passes find claims the first missed.
Tier 0, the default, is novelty by embedding similarity: “have I seen this before” is a distance question, and embeddings answer it better and far more cheaply than a language model would.
Tier 1, optional, adds a language model for specificity, evidence quality and red flags. The judge is pluggable by design: a 7B locally, a 70B on serious hardware, a cloud API, if you bring one. Your hardware, your wallet, your tokens, your call. Every verdict records what judged it: tier, models, backend, judge location, prompt version, pack version, and whether the material stayed on this machine. Verdicts from different judges are not comparable and a corpus that silently mixes them is worthless six months later.
And a rule before all of that: a thin corpus produces no verdict. Below the pack’s minimum, novelty comes back as unknown, never new. On a fresh corpus every claim comes back ”?” and that is the correct answer. A blind spot is not a discovery.
RTFM. Check the parameter list. Example: Can you have more than one “interest” to watch loads of videos on? Sure, you can.
What I refuse to pretend
The local judge experiment is in the repo, and it is not flattering.
An independent local judge (27B parameters, a different family from the extractor) was asked to check extracted claims against their source. It reported 98% faithful and zero distortions across 85 claims. Then the claims were graded one by one against the source by a frontier model. That grading found three real distortions in a 25-claim sample. The local judge had marked all three as supported. There ain’t nothing as free lunch.
The 88% figure that replaced the 98% has its own confession printed next to it: the grading was done by a frontier model, not by a human, and an 88% that quietly implies human review is worth less than an honest 88%.
Two opposite prompt designs, same blindness. One lenient; one strict, demanding a verbatim supporting quote, verified programmatically. The strict prompt caught the same zero of three and added four false alarms. The prompt made the judge suspicious, not discerning. On this one sample, changing the prompt did not help, and the suspicion points at the model. One experiment is an indication, not a verdict.
The three distortions share one shape: the claim is stronger or simpler than the source. “The machine has 61 GB of RAM” becomes “The model requires 61 GB”. “The phrase book adds parameters and cuts computation” becomes “It reduces the parameters needed.” Neither is a hallucination. In both a qualifier was dropped in the course of making a standalone sentence out of conversational speech, and the class of model I could run locally could not see it under either prompt.
So Winnow stops there, on purpose. It hands you a short, structured, deduplicated list with its reasoning attached and the judgment that actually matters stays with something/someone capable of making it. No automated faithfulness check ships, because the only instrument available locally measured agreeableness, not faithfulness.
The refusal to pretend runs through the repo, not just this section. The numbers live in one file, MEASUREMENTS.json, and the file opens with the README’s own past: it once claimed a faster, smaller run than actually happened. Both errors flattered the tool. A test now asserts the README matches the file. More than two hundred behaviours in the test suite are verified to actually fail when the behaviour backing them is removed. Believe me when I say a few of those were found by mutating the source at random rather than by choosing what to test. A grading error made during the correctness study is recorded in the results. Not quietly fixed. An underpowered instrument producing false negatives that read as findings is the identical failure the study exists to detect.
The discipline has a paper trail for you, too. The post that described this machine also recorded two of its own failures, W-001 and W-003. Both are fixed commits in this repository. The receipt that was a promise in an essay is now an artifact a reader can clone and run.
Why it is public
The specialized version worked in a private folder and owed nobody anything. It had access to the whole documentation and code base, it passed judgement left and right. It could.
Everything that knew what a “claim” is and what “already-known” means lived in a prompt and a JSON file. We call it the pack. Take the pack out and what remains is the part I actually built: the corpus, the claims, the verdict and the refusal to answer without a memory. That part is not about trading, and it is not only mine. Every hour of video you will not have to re-watch is yours.
It is public because a private tool cannot be checked. The refusals above only mean something if you can pull the repository and try to break them. Write your own pack for your own field, keep it private if you like: the machine stays mine, the judgment stays yours.
Privacy, briefly
Your material never leaves your machine by default. Five things in the repository can reach the network; all five are documented in one table, and winnow status states exactly what leaves your machine under your current settings.
Obviously, do not trust it. Read, always read. Check my claims. Just be sure there is no malice in there. I promise. Only my clumsiness.
That command is the authority. The README only summarizes it. The one setting that decides whether your text goes anywhere is where your own model server lives.
If you point it away from localhost, status says so plainly because attaching a personal knowledge base to a remote model is precisely the thing you deserve to be told about beforehand.
How to get it
Clone it. MIT. The runtime has no dependencies: Python 3.10+, standard library only. You bring Ollama and three models, and yt-dlp if you want to pass URLs. Winnow never installs either on your behalf. There is no PyPI package and there will not be one: a package install would look successful and do nothing, because it cannot deliver a model server. The wheel was built and installed into a clean environment to verify that it fails honestly. You can spend the effort and change to your favorite local AI running harness.
A pack is a JSON file and a prompt. If your field is not AI tooling, that is the part you write and it stays yours.
Cheers.
Repo: https://github.com/bkoken20/winnow