Releases: yogthos/newsroom
Release list
newsroom v0.4.0
Briefings now remember stories across days, rank them by how widely and how
long they've been covered, keep a running note on each storyline, and roll the
stored days up into weekly and monthly digests.
Added
- Near-duplicate collapsing. Stories from different outlets whose headlines
and summaries embed within:dupe-threshold(0.62) are folded into one
source that credits the other outlets. The embeddings come from
potion-mxbai-128d-v2, bundled inresources/embedand run in-process, with
no model server. - Storylines and ranking. Each day's items are linked by embedding to the
storylines of the last:trend-days(7), within:story-threshold(0.6).
An item's weight is the outlets carrying its story today plus those on
earlier days, an earlier day counting half as much every:half-life-days
(2). The heaviest stories come first in the prompt with a coverage line, and
are the last cut by:max-items. - Story notes. After each briefing, one more model call keeps a running
note on every storyline the briefing cited: a stable title, where it stands,
and up to:story-notes(12) dated facts, each tied to the report it came
from. The next briefing gets the notes of the stories still running as
background. A:notesrole can give the job a cheaper model. - Weekly and monthly digests. Once a week (Monday to Sunday) or a month is
over, a digest is written from its days: the storylines ranked by coverage
and labelled emerging, persistent, fading or steady against the four periods
before, citing the facts in their notes, with each day's standfirst.
digest.mdis their prompt,:digestschooses which run, and
:digest-stories(15) is how many storylines one is given. A missing digest
can be written from its page. - New pages.
/week/YYYY-Wwwand/month/YYYY-MMfor digests (with
.mdversions),/storiesfor every storyline, and/story/DAY/Nfor one
storyline's summary, timeline of facts and coverage by day. - Sidebar. Storylines, then Monthly, Weekly and Daily sections, a
standfirst under each day, and feed health on the desk: each source's last
success and how many times in a row it has failed. - Standfirsts. The briefing opens with a one-sentence
>blockquote,
stored as the day's standfirst and shown in the archive.
Changed
- A story told in any of the last
:seen-days(3) briefings is left out of
today's, not only one from yesterday's. Collapsed copies count as told too. - Outlets are counted by publisher domain, so one publisher's several feeds
count once, and a story whose dateline names a wire agency, like
WASHINGTON (AP) —, counts as the agency's however many outlets reprint it. - The daily prompt explains the coverage lines, and that a story many outlets
carry or that keeps coming back deserves more weight. - Each source's coverage, the story notes and the standfirsts are kept four
months longer than:keep-days, so a month's digest can always be compared
with the four months before it. - The stylesheet and diagram script are files under
resources/public. dev/make-embed-model.cljpackages the embedding model with jolt, replacing
the Python script.- The user agent is
newsroom/0.4.
Upgrading
The database gains its new tables and columns on first start. Days stored
before this release get storylines worked out from their stored headlines the
first time a run or a digest reads them, which can take a few minutes once.
Story notes start with the first briefing after the upgrade, and the
Storylines section appears in the sidebar then. config.edn needs no
changes, since every new key has a default; examples/config.edn documents
them. digest.md is written to the config directory on first start.
newsroom v0.3.0
Each briefing now picks up where the last one left off. Stories that were already in the previous briefing are left out, matched by their address or by their headline, and the model gets the previous briefing's overview as what's already been established, so it writes about what changed instead of retelling yesterday. If you've edited prompt.md, {{previous}} marks where that overview goes; without it, it goes just before the sources.
The schedule takes :run-every-hours, how far apart runs are after :run-at, a day by default. Something like 6 refreshes the day's briefing through the day, and a wake only re-gathers when the day's briefing is at least that old.
Standalone binaries for macOS (arm64) and Linux (x86_64).
Unpack the archive and run newsroom, then open http://127.0.0.1:3000. The first run writes its config to ~/.config/newsroom, and config.example.edn shows every option. The plugins in plugins/ add sources newsroom doesn't read itself; copy a plugin's folder to ~/.config/newsroom/plugins/ to use it. The default model is DeepSeek, which reads DEEPSEEK_API_KEY.
Runtime libraries: Linux needs sqlite3, libxml2 and OpenSSL 3, which most distributions have. macOS needs OpenSSL 3 (brew install openssl@3).
The macOS binary is unsigned, so clear the quarantine flag before the first run: xattr -d com.apple.quarantine ./newsroom.
newsroom v0.2.1
Set NEWSROOM_HOME to keep the config, prompt, plugins, database and briefings somewhere other than ~/.config/newsroom, which is how to run newsroom as a service, for example with NEWSROOM_HOME=/var/newsroom. The README has a systemd unit to start from.
Standalone binaries for macOS (arm64) and Linux (x86_64).
Unpack the archive and run newsroom, then open http://127.0.0.1:3000. The first run writes its config to ~/.config/newsroom, and config.example.edn shows every option. The plugins in plugins/ add sources newsroom doesn't read itself; copy a plugin's folder to ~/.config/newsroom/plugins/ to use it. The default model is DeepSeek, which reads DEEPSEEK_API_KEY.
Runtime libraries: Linux needs sqlite3, libxml2 and OpenSSL 3, which most distributions have. macOS needs OpenSSL 3 (brew install openssl@3).
The macOS binary is unsigned, so clear the quarantine flag before the first run: xattr -d com.apple.quarantine ./newsroom.
newsroom v0.2.0
Newsroom can now load plugins that add new kinds of sources. A plugin is a folder of Clojure namespaces in ~/.config/newsroom/plugins/<name>/, loaded at startup, with its settings under :plugins {:<name> {...}} in config.edn. Plugins are written against newsroom.plugin; the README has the details.
Two come with this release, in plugins/ in the archive:
redditreads subreddit feeds and follows each post to the article it links to, so the briefing gets the stories rather than reddit threads. Reddit only allows about one feed read a minute without logging in, so put all your subreddits in one source:{:type :reddit :subreddit ["technology" "worldnews"]}.slackreads a Slack channel with a bot token.
This release also fixes the page not showing a finished briefing until reload when it's opened over plain http at a LAN address (with :host "0.0.0.0"). The page's tab id now reaches the server as well (glimmer-datastar v0.1.2).
Standalone binaries for macOS (arm64) and Linux (x86_64).
Unpack the archive and run newsroom, then open http://127.0.0.1:3000. The first run writes its config to ~/.config/newsroom, and config.example.edn shows every option. The plugins in plugins/ add sources newsroom doesn't read itself; copy a plugin's folder to ~/.config/newsroom/plugins/ to use it. The default model is DeepSeek, which reads DEEPSEEK_API_KEY.
Runtime libraries: Linux needs sqlite3, libxml2 and OpenSSL 3, which most distributions have. macOS needs OpenSSL 3 (brew install openssl@3).
The macOS binary is unsigned, so clear the quarantine flag before the first run: xattr -d com.apple.quarantine ./newsroom.
newsroom v0.1.0
Standalone binaries for macOS (arm64) and Linux (x86_64).
Unpack the archive and run newsroom, then open http://127.0.0.1:3000. The first run writes its config to ~/.config/newsroom, and config.example.edn shows every option. The default model is DeepSeek, which reads DEEPSEEK_API_KEY.
Runtime libraries: Linux needs sqlite3, libxml2 and OpenSSL 3, which most distributions have. macOS needs OpenSSL 3 (brew install openssl@3).
The macOS binary is unsigned, so clear the quarantine flag before the first run: xattr -d com.apple.quarantine ./newsroom.