Repository navigation
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