Repository navigation
Releases: mohitmishra786/weirling
Release list
Weirling v0.3.5 (2026-10-26)
Rankings that follow every interest you confirmed, starter packs that no
longer add broad topics of their own, and an Emerging card about your feeds.
Before you upgrade
No action needed beyond the usual upgrade steps. The new
ranking applies from the next digest.
Ranking
- An article was compared with only your three strongest interest clusters,
and with one representative topic per cluster. With many equal interests
(any onboarding with confirmed topics), most of them never counted: every
article scored about the same, and a Python tutorial could lead a digest
for a reader who asked for kernels and compilers. Each article is now
compared with every interest topic, weighted by how strong its cluster is,
and "Why this?" names the topic that matched.
Interests
- Subscribing to a pack added an interest named after it ("Hardware &
Electronics", "Programming Languages") even when you had described your
interests, which pulled in everything the pack carries. A pack now adds a
topic only for readers with fewer than three interests, and onboarding
removes the ones added before your topics were saved. - Topic names are matched without case, so "Systems Programming" and
"Systems programming" are one interest; your own wording is kept.
Digest
- "Emerging this week" counted every reader's feeds on the instance and,
with no history yet, called every topic new. It now uses your feeds only,
and stays hidden until they have two weeks of history.
Images
ghcr.io/mohitmishra786/weirling/weirling-backend:0.3.5ghcr.io/mohitmishra786/weirling/weirling-frontend:0.3.5ghcr.io/mohitmishra786/weirling/weirling-aio:0.3.5ghcr.io/mohitmishra786/weirling/weirling-backend:0.3.5-lite(no torch)
Pin it with WEIRLING_VERSION=0.3.5 in .env; see docs/UPGRADING.md.
Weirling v0.3.4 (2026-10-26)
Claude as the first summary provider with Groq behind it, starter packs
that don't overlap, feed discovery for blogs in a sub-folder, and a reader
that fits the screen.
Before you upgrade
No action needed beyond the usual upgrade steps.
Migration 0048 runs on start: it removes HTML left in stored extract
summaries (LLM summaries are not touched).
Optional: set ANTHROPIC_API_KEY to have Claude (claude-haiku-5-5 by
default) answer first, with your LLM_* provider as the fallback
(configuration).
Summaries
- Providers are tried in order: Claude when
ANTHROPIC_API_KEYis set, then
LLM_*, then the OpenAI fallback, then an extract. A rejected key, an
empty credit balance or a rate limit benches a provider for a while, so
the next one answers at once instead of each article waiting on a failure. - A Groq daily cap (
429with a longRetry-After) now pauses Groq until
then, instead of asking again for every article. - Extract summaries showed raw markup for some feeds (
<p>Article URL: <a href=…). They are plain text now, and existing ones are cleaned. - Hacker News and Lobsters entries hold no article, only links. They now
read "Discussion: 37 points, 13 comments on Hacker News" with a link, and
are not sent to the model.
Onboarding and starter packs
- Starter packs were rebuilt: 25 packs, 268 feeds, each feed in exactly one
pack and every feed checked live. 43 dead, blocked, stale or mislabelled
feeds were replaced (one pack listed the same feed three times; "Stonebraker
Blog" pointed at Atlassian's developer blog). A test fails if a feed is
ever added to two packs. - New pack: Backend & Distributed Systems (Marc Brooker, Martin Kleppmann,
Werner Vogels, aphyr, Murat Demirbas and others). - The model now picks the packs for your interests (cached, 5 s limit,
taxonomy as the fallback). Word matching had suggested the UI design pack
for "system design". - Suggested topics are short labels ("Consensus algorithms"), not sentences.
- The pack picker has a search box over pack names, descriptions and the
sources inside each pack, and each pack says what it covers.
Sources
- A blog in a sub-folder (
user.github.io/Blog/) is found from its page
URL: discovery tries the folder before the site root and follows feed
links in the page body, not only<link rel="alternate">. substack.com/@namefollowsname.substack.com; othersubstack.com
links say to use the publication's address instead of following a feed
that doesn't exist.- Adding a creator's blog uses the same checked discovery as adding a source.
- Feeds up to 8 MB are accepted (
FEED_MAX_BYTES); danluu.com's 6.6 MB feed
was rejected.
Reader and layout
- On laptops the reader shows the article at a readable width with a side
panel: summary, progress and time left, text size and surface, and the
link to the original. Phones keep one column. - Long URLs, tables and embeds no longer widen the page on phones.
- Source cards: on phones, Pause and Remove sit under the details, so a long
name or error can't push them off screen.
Operations
- Workers and beat log JSON to stdout like the API, so a platform's error
view shows only errors (Celery's INFO lines went to stderr). - Database connections are recycled every 5 minutes and time out after
10 s; Redis and the Celery broker use keepalives and health checks. A
connection dropped while idle no longer stalls a request.
Images
ghcr.io/mohitmishra786/weirling/weirling-backend:0.3.4ghcr.io/mohitmishra786/weirling/weirling-frontend:0.3.4ghcr.io/mohitmishra786/weirling/weirling-aio:0.3.4ghcr.io/mohitmishra786/weirling/weirling-backend:0.3.4-lite(no torch)
Pin it with WEIRLING_VERSION=0.3.4 in .env; see docs/UPGRADING.md.
Weirling v0.3.3 (2026-10-25)
Faster first-run setup, feeds that stopped failing on IPv4-only hosts, and
one consistent look for every form control.
Before you upgrade
No action needed beyond the usual upgrade steps.
Fixes
-
Embeddings ran 500 times slower than they should in containers: PyTorch
started a thread per host core and fought over a 2-vCPU quota (30 to 40 s
per article on Railway, now 0.06 s). Threads now follow the container's
CPU quota;OMP_NUM_THREADS/TORCH_NUM_THREADSstill override it. -
Feeds on dual-stack sites (Cloudflare, Google, AWS and many more) failed
at random with "All connection attempts failed" on hosts without outbound
IPv6. The fetcher now tries IPv4 first and falls back to the site's other
validated addresses before giving up. -
Onboarding: "Start Weirling" went back to the last step instead of to the
digest. It now opens the digest, and a second click after a slow first
one no longer errors. -
Onboarding: picking several starter packs is one request instead of one per
pack (POST /api/v1/sources/starter-packs/subscribe), and packs that share
feeds no longer risk adding a feed twice. -
A selected starter pack was white text on a cream card. Selected and
status states (packs, ratings, saved, source health, the import drop zone)
now use one set of dark-theme styles. -
Hosted without billing: nobody's trial runs out (no trial emails, pausing
or deletion) until a billing provider is configured; the Plan section
says early access instead of counting down. -
The Ingestion page works for the instance owner (it asked for the
operator metrics token and showed "HTTP 401"), loads only the columns it
needs, and its nav link shows to the owner only. -
Preferences no longer says "no key" when
LLM_API_KEYis set (it only
checked the deprecatedGROQ_API_KEY). -
Fetch jobs for new sources are queued after the database commit, so the
worker always sees them.
Security
- brotli 1.2.1 (two advisories; reachable through feed decoding).
- Security headers (
nosniff,DENYframing, no referrer, HSTS) on every
API response. - Secret scanning (gitleaks) on every pull request.
Highlights
- The interest graphs (Interests and Preferences) are a live force layout
in the spirit of Obsidian's graph view: topics spring into place, related
ones cluster, the strongest are named and the rest appear as you zoom,
and hovering a topic lights up what it connects to. Pan, zoom, drag, and
drop one topic on another to merge. - Preferences and the Ingestion page are rebuilt on the design system.
- Every select, text field, time field, textarea and checkbox shares the
design system's look, including the select chevron. The onboarding wizard,
plan and LLM-key sections use the shared button and input styles instead of
their own.
Images
ghcr.io/mohitmishra786/weirling/weirling-backend:0.3.3ghcr.io/mohitmishra786/weirling/weirling-frontend:0.3.3ghcr.io/mohitmishra786/weirling/weirling-aio:0.3.3ghcr.io/mohitmishra786/weirling/weirling-backend:0.3.3-lite(no torch)
Pin it with WEIRLING_VERSION=0.3.3 in .env; see docs/UPGRADING.md.
Weirling v0.3.2 (2026-10-25)
Email can now go out through Resend's HTTPS API, for hosts that block SMTP.
Before you upgrade
No action needed beyond the usual upgrade steps. SMTP
keeps working as before; Resend is used only when RESEND_API_KEY is set.
Highlights
- Send email through Resend (
RESEND_API_KEY,EMAIL_PROVIDER=auto|smtp|resend).
Network errors, 429 and 5xx are retried with backoff; sign-in and
confirmation links carry an idempotency key, so a retry never sends one
twice.
Fixes
- On hosts that block SMTP (Railway Hobby), sign-up and "Resend the link"
no longer wait 30 seconds on a connection that can't succeed, once Resend
is configured.
Operators
- New settings:
EMAIL_PROVIDER(defaultauto),RESEND_API_KEY(a
sending-only key;FROM_EMAILmust be on a domain verified in Resend). - The setup screen's email test sends through Resend when it is active.
Images
ghcr.io/mohitmishra786/weirling/weirling-backend:0.3.2ghcr.io/mohitmishra786/weirling/weirling-frontend:0.3.2ghcr.io/mohitmishra786/weirling/weirling-aio:0.3.2ghcr.io/mohitmishra786/weirling/weirling-backend:0.3.2-lite(no torch)
Pin it with WEIRLING_VERSION=0.3.2 in .env; see docs/UPGRADING.md.
Weirling v0.3.1 (2026-10-25)
Fixes the published backend images: in v0.3.0 the full and lite tags held
the same amd64 image, the lite one.
Before you upgrade
No action needed beyond the usual upgrade steps. If you
ran the v0.3.0 weirling-backend image on amd64, you were on the lite build
(hash embeddings); items it embedded keep those vectors until they age out.
Fixes
weirling-backend:0.3.1is the full image and0.3.1-litethe lite one,
on both amd64 and arm64. The publish job now refuses to tag anything but
exactly one image per architecture.- A clear "DATABASE_URL is empty" error instead of a SQLAlchemy traceback.
Operators
- The Railway and Vercel guide is corrected: connection variables go on each
service,DATABASE_URL_PRIVATEfor Postgres, and the api listens on
0.0.0.0.
Images
ghcr.io/mohitmishra786/weirling/weirling-backend:0.3.1ghcr.io/mohitmishra786/weirling/weirling-frontend:0.3.1ghcr.io/mohitmishra786/weirling/weirling-aio:0.3.1ghcr.io/mohitmishra786/weirling/weirling-backend:0.3.1-lite(no torch)
Pin it with WEIRLING_VERSION=0.3.1 in .env; see docs/UPGRADING.md.
Weirling v0.3.0 (2026-10-25)
ReadPrism is now Weirling, with hosted plans and the North Star metrics.
Before you upgrade
- Read ReadPrism is now Weirling:
keep your install folder's name (or setCOMPOSE_PROJECT_NAME=readprism),
because Docker volume names come from it. - Rename the email settings:
ZOHO_*is nowSMTP_*and the old names
are not read (details). - Migrations 0039 to 0047 run on start; none drops data.
Highlights
- Renamed to Weirling; domain weirling.com (#340).
- Hosted plans: Reader and Pro, a 30-day trial with Pro features, no free hosted
tier (#172, #341); Pro-only features (#246). - First-party product metrics and the owner dashboard at
/admin/metrics(#131). - Readers can bring their own LLM key on hosted (#255).
Fixes
- Digests are marked opened again, so win-back emails no longer reach active
readers (#131). - gpt-oss summaries no longer run out of tokens; long provider rate-limit waits
no longer stall workers (#225).
Operators
WEIRLING_VERSIONpins images (READPRISM_VERSIONstill read).- Email:
SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASSWORDreplace the
ZOHO_*settings;FROM_EMAILis now honoured; newFROM_NAME,
REPLY_TO_EMAIL,SUPPORT_EMAIL; port 465 works. Every email now carries
DateandMessage-IDheaders, which spam filters expect. - Railway and other hosts: a plain
postgres://DATABASE_URLworks. - New settings:
PRODUCT_METRICS,HOSTED_PAUSED_DELETE_DAYS,
HOSTED_DELETE_REMINDER_DAYS,HOSTED_PRO_MAX_POLL_MINUTES,
LLM_REASONING_EFFORT,LLM_MAX_RETRY_WAIT_SECONDS. - Migrations: 0039 quota overrides, 0040 trial email stage, 0041 users' LLM keys,
0042 takedown list, 0043 terms consent, 0044 deletion reminder,
0045 product events, 0046 interest embedding model, 0047 SMTP setting names.
Images
ghcr.io/mohitmishra786/weirling/weirling-backend:0.3.0ghcr.io/mohitmishra786/weirling/weirling-frontend:0.3.0ghcr.io/mohitmishra786/weirling/weirling-aio:0.3.0ghcr.io/mohitmishra786/weirling/weirling-backend:0.3.0-lite(no torch)
Pin it with WEIRLING_VERSION=0.3.0 in .env; see docs/UPGRADING.md.
weirling-rank 0.1.2
weirling-rank 0.1.2 on PyPI: https://pypi.org/project/weirling-rank/0.1.2/
pip install weirling-rank==0.1.2
Changes
- v0.3.5: rank against every interest, no pack-name topics, per-reader emerging
weirling-rank 0.1.1
weirling-rank 0.1.1 on PyPI: https://pypi.org/project/weirling-rank/0.1.1/
pip install weirling-rank==0.1.1
Changes
- Code scanning: no exception text in API responses, masked ids and sanitized provider text in logs; tidy
weirling-rank 0.1.0
weirling-rank 0.1.0 on PyPI: https://pypi.org/project/weirling-rank/0.1.0/
pip install weirling-rank==0.1.0
Changes
- [#245] weirling-rank: a GitHub Release per version (not marked Latest)
- [#245] Release weirling-rank automatically when ranker code is merged
- [#245] One source for weirling-rank, MIT, Trusted Publishing on its own tags only
- [#245] Extract ranker as reusable library packages/weirling-rank with DB adapter