Repository navigation
Releases: kriasoft/obserf
Release list
v0.3.0 — a redesigned review inbox
Obserf finds public conversations where mentioning your project would actually help someone, ranks them, and drafts what to say. It never posts. You read the thread, check the venue's rules, edit the draft, and post it yourself.
It exists for maintainers who have no time to promote what they build. Search turns up hundreds of loosely related pages, and working out which are active, relevant and open to a maintainer's reply takes longer than writing the reply. Obserf turns that reading into a short, ranked inbox with a reason beside every finding. It runs on your machine, on your Claude Code subscription, with no account and no API key.
Get started
You need Bun 1.4+ and Claude Code signed in with a subscription.
bunx @obserf/cli init ~/dev/marketing # create a workspace
cd ~/dev/marketing && bun install
$EDITOR projects/example.ts # describe your project, write real queries
bun run obserf scan --dry-run # discover and gate only: no model calls
bun run obserf scan # let Claude assess what survived
bun run obserf serve # review at http://127.0.0.1:4000Hacker News and GitHub work without credentials. The README covers Reddit, Brave and writing a good profile.
What's new in 0.3
The review inbox is redesigned so you can work through a queue quickly, mostly from the keyboard, and always tell the model's opinion apart from the facts and from your own notes.
- Read in the order you decide. Each finding shows the model's verdict first, then the page's own words, then the score. "Why 55?" shows exactly how the score was calculated.
- Every action has a key. A bar at the bottom shows each decision with its key. Press ? to see all shortcuts, and [ ] to switch tabs.
- Undo right where you decided. After each decision a small toast offers Undo, the dismissal reasons and a "where did you post it?" field.
- Scan health at a glance. A pill in the header shows how old your scans are and whether any source was skipped or failed. Click it for the full report.
- The list holds still. If a scan finishes while you're reviewing, a banner offers to refresh instead of reshuffling the list under you.
- Empty means explained. An empty tab says why: zero-scored findings hidden, nothing new, or a scan that didn't see everything.
- Scores are plain numbers. The old green and amber colours suggested precision the ranking doesn't have. Only a score forced to zero by a hard rule is marked, and the rule is named.
- Light and dark themes, with contrast and screen-reader support checked in both.
The hide reasons toggle is now called Hide judgment. It works the same way.
Upgrading from 0.2
bun add @obserf/cli@0.3.0Then restart obserf serve. There are no database changes in this release.
Full changelog: v0.2.0...v0.3.0
v0.2.0
Obserf finds public conversations where mentioning your project would actually help someone, ranks them, and drafts what to say. It never posts. You read the thread, check the venue's rules, edit the draft, and post it yourself.
It exists for maintainers who have no time to promote what they build. Search turns up hundreds of loosely related pages, and working out which are active, relevant and open to a maintainer's reply takes longer than writing the reply. Obserf turns that reading into a short, ranked inbox with a reason beside every finding. It runs on your machine, on your Claude Code subscription, with no account and no API key.
Get started
You need Bun 1.4+ and Claude Code signed in with a subscription.
bunx @obserf/cli init ~/dev/marketing # create a workspace
cd ~/dev/marketing && bun install
$EDITOR projects/example.ts # describe your project, write real queries
bun run obserf scan --dry-run # discover and gate only: no model calls
bun run obserf scan # let Claude assess what survived
bun run obserf serve # review at http://127.0.0.1:4000Hacker News and GitHub work without credentials. The README covers Reddit, Brave and writing a good profile.
What's new in 0.2
- Two ways to say no. Use
skippedfor a good finding you won't pursue, anddismissedfor one Obserf shouldn't have shown you, with a category saying why (--category, or keys 1–8 in the inbox). Only dismissals count against the ranking, and each category points at what to fix, usually a line innotFor. - Scores stay current. A score is computed from the stored ratings and the thread's age when you read it, so an old thread sinks on its own.
rescoreis gone because nothing needs it. - Look back at a scan.
obserf runsshows what each scan ran, what the gate dropped and what it spent.obserf list --run <n>shows that scan's top 10 as it left them, frozen, next to what you've done with each since. - Judge before you see the reason. In the inbox, hide reasons keeps the model's score and reason off a new finding until you've decided for yourself.
- Better drafts. Drafting reads the thread's current text first: Hacker News items, GitHub issues, pull requests, repository READMEs, and other pages as plain text. It refuses a thread that is deleted or locked, and it says when it had to fall back to the stored excerpt.
- A smoother inbox. It picks up an edited profile without a restart, u undoes the last status change, and after a it asks where you posted.
- Stricter by default. Each command rejects flags that belong to another command. The web API validates what the CLI validates, and an error never exposes source code or file paths.
Upgrading from 0.1
bun add @obserf/cli@0.2.0Stop obserf serve and any running scan first. On the next command, Obserf backs up the database and then applies two migrations; the output says where the backup went.
In 0.1, dismissed meant both "not for me" and "shouldn't have been shown". Run bun run obserf list --status dismissed and change any finding that was really the first kind with bun run obserf triage <id> skipped, so it doesn't count against the ranking.
Supply chain
This is the first release published through npm trusted publishing. CI builds it from the tagged commit and staged it with provenance, and a maintainer approved it with 2FA. No npm token exists to leak. See SECURITY.md to report a vulnerability privately.
Full changelog: v0.1.0...v0.2.0
v0.1.0
Obserf finds public conversations and listings where mentioning your project could help someone, ranks them, and drafts what to say. It never posts — you read the thread, check the venue's rules, edit the draft, and post it yourself.
It is a personal tool, not a service: one operator, a handful of projects, one SQLite file on your machine. No account, nothing to sync, and your profiles, database and credentials stay in a workspace you own.
How it works
discover → gate → enrich → assess → score → store
- Discover — Hacker News, Reddit, GitHub and Brave, using the queries in your project profile.
- Gate — deterministic rules run before the model: duplicate, settled, blocked, stale, thin, unchanged, ruled-out. Cheap facts first, so model quota goes to candidates worth reading.
- Assess — Claude rates
relevance,intent,welcomeandreachfrom 0–5 and may disqualify outright. Code turns those into a 0–100 score; zero relevance, zero welcome or a disqualification zeroes it. A score is a reading order, not permission. - Review — a ranked inbox in your terminal or browser, with the reason behind every finding.
- Draft — written on request, from the thread's current text where Obserf can fetch it.
Requirements
- Bun 1.4+
- Claude Code, installed and signed in with a subscription. Obserf calls the model through the Claude Agent SDK with tools disabled, so there is no API key to set — it uses the quota shared with your interactive sessions.
Get started
bunx @obserf/cli init ~/dev/marketing
cd ~/dev/marketing
bun install
$EDITOR projects/example.ts # replace the scaffold's placeholder queries
cp .env.example .env # only the sources you plan to use
bun run obserf scan --dry-run # discovery and gating only — no model callsWrite each query the way someone with your project's problem would actually type it. A profile still carrying the scaffold's placeholders is skipped rather than searched for.
The daily loop
bun run obserf scan --project example
bun run obserf list --project example
bun run obserf show 42
bun run obserf draft 42
bun run obserf triage 42 acted --note "Posted a reply"Or review in the browser with bun run obserf serve → http://127.0.0.1:4000 (loopback only, unauthenticated): j/k to move, o to open, n/s/d/a to triage, u to undo.
Also in this release: rescore (recompute scores with no model calls), runs (what each scan ran, dropped and spent), projects, and backup · backups · restore.
Sources
| Source | Credentials |
|---|---|
hn |
None — Hacker News through Algolia |
reddit |
REDDIT_CLIENT_ID and REDDIT_CLIENT_SECRET (script app, app-only OAuth) |
github |
GITHUB_TOKEN, or the signed-in gh CLI; unauthenticated works at a lower rate |
brave |
BRAVE_API_KEY from a Brave Search API account |
A source that cannot run is skipped with a reason — missing credentials and "your profile gave me nothing to ask" never look like a quiet week.
What a finding is, and is not
An opportunity must be useful, permitted, and free. Obserf establishes the first one. The model has no tools, so it cannot open a subreddit's sidebar or a submission's pricing page: it rejects on evidence, but it can never certify the absence of a rule.
Important
What reaches your inbox is not known to be forbidden and not known to cost money — a deliberately weaker claim than permitted and free. Checking those two is your step, in the venue, before posting. It is one of the reasons there is no posting code path to turn on.
Status
The discovery, review and drafting loop is complete end to end. What is not yet established is that it surfaces enough worth posting: there is no outcome tracking and no eval set, so treat the ranking as a reading order rather than a measured result. See the roadmap.
Links
- npm —
@obserf/cli - Docs — README · architecture · decision records
- Site — obserf.com