Readout

io.github.kaitzyy-dev由 GitHub 帳號 kaitzyy-dev 發布v1.0.0更新於 Oct 27, 2026

Measured readings on open-source dependencies: health, end-of-life, model prices, incidents.

已驗證Streamable HTTP可網頁執行開發者工具安全與監控AI 與機器學習

概覽

AI 產生的概覽

Readout 提供開源相依套件的實測讀數——健康度、生命週期終止、模型價格與供應商故障——讓助理在安裝前查核套件。

可以做什麼
  • 檢查單一套件或整份清單:是否被撤回、是否執行安裝腳本、儲存庫是否封存、公告數量、授權條款與最後推送時間
  • 比較受監控儲存庫的下載量、評分卡、公告、分支與星號,並搜尋受監控清單
  • 查詢執行環境、資料庫與框架的生命週期終止日期,以及主機或 API 供應商的故障紀錄
  • 依價格與上下文視窗尋找語言模型,含價格歷史與已下架模型
  • 維護私有監控清單,並列出某日期以來的變化
  • 解釋某項發現的來源,並一次稽核整份清單
適用情境
適合助理在撰寫或審查程式碼時需要相依套件的當前事實、而非訓練資料記憶的情況:新增套件前、稽核清單時,或確認某執行環境是否仍受支援。也適合比較模型價格與供應商可靠度。
執行需求
遠端 streamable HTTP 端點;九個免費工具無需金鑰或帳號,其餘二十二個工具需要付費金鑰。無需本機安裝。
安裝前請注意
三十一個工具中有二十二個為付費工具,需要金鑰。監控清單相關工具會寫入與該金鑰綁定的私有清單。讀數並非即時(最短四小時),且僅涵蓋人工挑選的部分儲存庫,因此沒有發現並不代表套件安全。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Readout,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.kaitzyy-dev%2Freadout/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "readout": {
      "type": "http",
      "url": "https://readout-7pt.pages.dev/api/mcp"
    }
  }
}

README

Sighttrue

sighttrue.com · your stack · compare · method · feed

Check your dependencies in CI

yaml
permissions:  pull-requests: write   # only needed for the comment
steps:  - uses: actions/checkout@v4  - uses: sighttrue/sighttrue@v1    with:      manifest: package.json      fail-on: withdrawn,archived,relicensed

Fails the build when a dependency's own publisher has withdrawn it — npm calls it deprecated, PyPI and crates.io call it yanked, RubyGems yanked, Packagist abandoned, NuGet deprecated — or when its repository has been archived or moved to a source-available licence, and reports advisories either way. Reads package.json, requirements.txt, pyproject.toml, Cargo.toml, composer.json and Gemfile. No key, no account, no service to sign up to — it reads published measurements and talks to OSV. A network problem is never a finding: if the readings cannot be fetched the step says so and passes, because a build that breaks when somebody else's site is down is a build that gets deleted.

On a pull request it also leaves a comment with the findings as a table, and rewrites that same comment on every push rather than adding another. A red build tells a reviewer that something is wrong; it does not tell them which dependency, or what changed about it, without opening the log. Set comment: false to report only in the step summary. A pull request from a fork gets a read-only token, so the comment is skipped there and the step still passes.

Also runs against requirements.txt and Cargo.toml.

Or install the App and change nothing

The Action needs a workflow file in every repository that wants it. The GitHub App needs one install and then watches every repository it is given, with no workflow, no key and no configuration: when a pull request adds a runtime dependency that is on the watchlist, it leaves one comment with what is on record — downloads, OpenSSF scorecard, advisory count, licence, last push — and edits that same comment on every later push.

It says nothing at all when a pull request changes no manifest, adds no dependency, or adds nothing that is tracked. That is the common case and it is the point: a bot that comments to say it found nothing gets uninstalled. It never calls a package safe, unsafe or recommended, because none of those are things this project measures.

The Action fails a build; the App only reports. Both read the same published bundle, so they cannot disagree.

An SBOM you are allowed to hand over

/stack exports the readout as a CycloneDX 1.6 document, with each dependency's advisory count, scorecard, licence, publish date and bus factor attached as properties. Built in the browser from the pasted manifest, like everything else on that page — nothing is uploaded, and there is no endpoint to send a manifest to.

It states no versions. A manifest declares ^1.6.0; it does not say what was installed, and it says nothing about the transitive tree underneath. The document says both of those things in its own metadata rather than leaving a reader to notice, because an SBOM that guessed would be worse than none: a compliance artefact asserting something nobody resolved.

Suggest something to watch

The watchlist is curated and partial, and it was chosen by hand with no method beyond judgement — its weakest point. Open an issue to argue for a repository. Every change to the list is a reviewed commit, so that issue is where the review happens.

For coding agents

An MCP server over the same readings, so an agent can answer "is this dependency healthy" from a measurement taken today rather than from training data a year old.

json
{ "mcpServers": { "readout": { "url": "https://sighttrue.com/api/mcp" } } }
Nine tools free, twenty-two paid. `check_before_install` is the one to reach for while writing code:

given a package it returns only what a reviewer would be annoyed to discover afterwards — a publisher that withdrew it, scripts it runs on the installing machine, an archived repository, advisories, a source-available licence, a long silence — each with the address of the body that published it. It does not say whether to install. It says what is on record so the decision is made knowing it, and an empty result says plainly that it means nothing was found rather than that the package is safe.

Then check_package, check_stack, search_repositories, compare_repositories, find_model, check_eol, check_provider, list_readings. Read-only, no key, no account. Every result carries the limits of what it can support, because an agent will paste these figures into a code review and a scorecard quoted without "measures declared practices, not whether the project is safe" is a claim this project does not make.

Without MCP, one GET returns the same thing:

curl 'https://sighttrue.com/api/verdict?pkg=npm:axios'curl 'https://sighttrue.com/api/verdict?pkg=pypi:django&version=4.2'

Advisories, licence, when the registry last shipped it, the bus factor, and whether the release is still supported — each with the address of the body that published it, so a figure quoted into a review can be checked in one click. Despite the name there is no verdict in it: no score, no rank, no recommendation. Those would be this project's judgement of somebody else's work wearing the costume of a measurement.

One agent watches 417 open-source repositories and takes

eleven readings, most of which never touch GitHub: 807 provider incidents kept after their own status pages dropped them, 522 release lines on the end-of-life clock, 382 model prices, 182 packages by real ship date, 416 commit histories for the bus factor. It runs every four hours on GitHub Actions, commits what it reads to this repository, and publishes a static site.

Every page and every bundle is a file. There are five dynamic routes and no page depends on any of them: /api/ask, /api/mcp, /api/chain, /api/github/webhook for the App, and the sign-in and watchlist endpoints under /api/auth and /api/watchlist. Signing in with GitHub saves a watchlist and nothing else — the readings on a signed-in page are the same published bundle anyone can download.

The commit history of data/ is the point. It is an audit trail: every reading is timestamped, append-only, and checkable against GitHub directly.

What it reports

Eleven readings, each named by the question it answers rather than by the collector that produces it. The same list drives the site's navigation, so the two cannot drift — they had, three times over, before it was written down once.

ReadingQuestion it answersTouches GitHub
LiveWhat changed in the last few hours?yes
ShipsWhat released a new version?yes
ForksWhat is being copied faster than its own baseline?yes
DemandWhat are developers asking for, across more than one project?yes
DependenciesWhat is being added, dropped, or jumped a major version?yes
LineageWhich models say they were built on which?no
Model pricesWhat does a million tokens cost, and when did that change?no
OutagesDoes the thing I depend on go down, and how often?no
EcosystemWhat do the registries, advisories and forums say?no
Depended onWhat does everything else quietly rely on?no
This weekWhat would I have missed looking once a week?—

The six that never touch GitHub are the answer to the fair complaint that a GitHub summariser is worth only what GitHub already shows you.

Whether each detector's threshold is reachable at all is published too, on the index under Our record. A detector nothing has ever come close to is not a quiet detector, it is a misconfigured one, and the site says so about itself.

How to read it

Every comparison is against a repository's own history, not against other repositories. "27× baseline" means 27 times what that project normally does, and the baseline is drawn on the chart so you can see what normal means.

Confidence is stated, never implied.

StateMeaning
formingUnder 14 days of history. Raw counts only. No multiplier is computed and none is implied.
detectedCrossed the threshold once. Neutral treatment.
confirmedPersisted across two consecutive daily snapshots.

Only confirmed signals are treated as findings. That costs up to a day of speed and buys the thing that cannot be bought back.

Generated prose is set in a different typeface from measured values. Where a sentence explains a number, every figure in that sentence is checked against the source record before it is published; if any of them is not in the record, the sentence is discarded and a templated one is used instead.

What this does not claim

  • The watchlist is curated and partial. It is chosen by hand and is not a survey of open source. Dependency and demand findings describe the repositories being watched, not the ecosystem.
  • The data is not real-time. Four hours is the floor, and scheduled runs are routinely delayed.
  • Nothing here predicts anything, and nothing here says a repository is good, bad, safe, or unsafe.
  • Appearing on the watchlist is an observation, not a relationship. No project listed here has endorsed this.

Published findings that turn out to be wrong are superseded by a correction event carrying the same prominence. Events are never deleted and history is never rewritten.

The data

Every bundle the site reads is served as JSON, so any claim can be checked against the same file the page used.

data/├── live/state.jsonl          Latest reading per repository. Sorted, rewritten each pulse.├── live/window.jsonl         Timestamped fork samples, for the rolling 24h delta.├── live/manifests.jsonl      Last-seen dependency set, diffed daily.├── history/YYYY-MM-DD.jsonl  One immutable snapshot per day.├── events/YYYY-MM.jsonl      Append-only. Never rewritten, never pruned.├── summaries.jsonl           Generated prose, keyed by event id.├── watchlist.jsonl           What is watched, and since when.└── meta.json                 Last run status.

Files are sorted with a fixed key order so a repository that did not change produces no diff. That is what keeps a repository committed to six times a day from growing without bound.

Running it

Node 24. Types are stripped natively, so there is no build step and no runtime dependencies.

It said 22.18+ until the D1 schema arrived. The tests load migrations/ into node:sqlite, which is stable in 24 and behind a flag in 22 — so on 22 the suite fails on an import rather than on an assertion, which is a confusing way to learn a version requirement.

sh
npm install          # dev dependencies only: typescript, vitest, fontsnpm testnpm run typecheck
node scripts/pulse.ts --limit=20   # needs GITHUB_PATnode scripts/daily.tsnode scripts/build.ts              # emits dist/

Watchlist maintenance

The watchlist is curated. Deriving it from a search query was tried and produced a worse list — topic search only finds repositories that tagged themselves, and sorting by stars ranks tutorials and link collections above infrastructure. derive-watchlist.ts is kept for proposing candidates a curator might have missed, and because the negative result is worth being able to reproduce.

sh
node scripts/verify-watchlist.ts   # check every entry against the APInode scripts/retire-watchlist.ts   # mark archived and deleted ones inactivenode scripts/derive-watchlist.ts   # propose candidates, writes nothingnode scripts/derive-packages.ts    # map repositories to packages, writes nothing

derive-packages.ts fills the packages field, which is what lets the agent ask what a project's downloads are doing rather than only what its repository is doing. It never maps on a name match: a candidate is proposed, the registry's own record for that name is fetched, and the mapping is kept only when the registry points back at this repository. That rule is not decoration — the first version matched on substring and mapped angular/angular to the npm package angular, which belongs to the archived angular/angular.js, and would have credited a dead project's downloads to a live one.

Nothing is ever removed. Retired entries stay on the list with active: false, because deleting one would erase the record that it was watched at all, and the findings collected while it was still link to it.

Two scheduled workflows do the rest. pulse.yml runs every four hours for repository base and releases; daily.yml writes the canonical snapshot, classifies spikes, and collects issues and manifests. Both commit every run, including when nothing changed — scheduled workflows are disabled after 60 days of repository inactivity, and that commit is what prevents it.

Configuration

SecretPurpose
SIGNAL_GITHUB_PATFine-grained token, public repository read only. Secret names cannot begin with GITHUB_.
CLOUDFLARE_API_TOKENCloudflare Pages: Edit
CLOUDFLARE_ACCOUNT_ID
GROQ_API_KEYOptional. Without it every reading still publishes, with numbers and no prose.

Both optional groups are genuinely optional: unset, their steps skip and say so. Nothing is marked as a failed run, because choosing not to configure something is not a fault, and a warning that is always on is a warning nobody reads.

License

MIT. See LICENSE.

Cost

Cloudflare Pages, GitHub Actions on a public repository, and Groq's free tier. Static assets and bandwidth on Pages are unlimited, so visitor traffic has no ceiling. Every remaining limit applies to the build side, which is bounded and predictable.

來源:README.md,提交 eb1ab3e

工具

31

check_before_install

Call this before adding a dependency. Returns only the facts a reviewer would be annoyed to discover afterwards: whether the publisher has withdrawn the package, whether it runs scripts on the installing machine, whether its repository is archived, how many advisories are on record, whether the licence is source-available, and how long since it was actually published. Each fact carries the address of the body that published it. It does not say whether to install; it says what is on record.

輸入參數name必填registry必填

check_package

Read the current standing of one open-source package: downloads with the window they cover, OpenSSF scorecard, advisory count, licence, whether the repository is archived, and when it was last pushed to.

輸入參數name必填registry必填

check_stack

Read a whole dependency list at once and report what is archived, what carries advisories, what has a source-available licence, and what has not been pushed to in a year. Use when reviewing a package.json, requirements.txt, Cargo.toml, composer.json or Gemfile.

輸入參數names必填registry必填

search_repositories

Find watched repositories whose name contains a string, with their current readings. Use it to discover what is covered before calling the other tools.

輸入參數limitquery必填

compare_repositories

Hold two watched repositories against each other across downloads, OpenSSF scorecard, advisories, forks, stars and findings on record. Compares only; it does not pick a winner.

輸入參數a必填b必填

find_model

Find language models by price and context window, from a catalogue read daily across sixty providers. Use this before choosing a model: prices move without announcement and training data is out of date on the day it ships.

輸入參數maxPriceproviderminContext

check_eol

Check whether a runtime, database or framework release is still receiving security fixes, and what to move to. Covers about two dozen products read daily from endoflife.date.

輸入參數cycleproduct必填

check_provider

Recorded incidents for a hosting or API provider over a window, kept after the provider’s own status page dropped them.

輸入參數daysprovider

list_readings

List every reading this server can return, what each one measures, and which require a key. Call this first if unsure which tool answers a question.

無需輸入參數。

who_can_publish

How many accounts hold publish rights on a package, as the registry lists them. Answers who can put code on your machine, which is a different question from who writes it. Requires a key; see https://sighttrue.com/pricing.

輸入參數name必填registry必填

package_weight_history

How the published artefact size has moved over time. Returns the readings taken, not a verdict. Requires a key; see https://sighttrue.com/pricing.

輸入參數name必填registry必填

withdrawn_but_installed

Packages whose own publisher has withdrawn them and which are still being installed heavily, with the download figure and the publisher’s notice. Requires a key; see https://sighttrue.com/pricing.

輸入參數limit

typosquat_check

Whether a name is one edit away from a more widely installed package. States that both names exist; which one was meant is the caller’s call. Requires a key; see https://sighttrue.com/pricing.

輸入參數name必填registry必填

funding_gap

Packages that ask for funding, beside how heavily they are installed and how many people write them. Requires a key; see https://sighttrue.com/pricing.

輸入參數limit

time_to_fix

Days between an advisory being published and a release appearing that postdates it, per package and as a distribution. Requires a key; see https://sighttrue.com/pricing.

輸入參數name必填registry必填

advisory_severity

Advisories broken down by severity rather than counted, with identifiers and dates. Requires a key; see https://sighttrue.com/pricing.

輸入參數name必填registry必填

runtime_deadlines

Support end dates for the runtimes a dependency set requires, including any already past. Requires a key; see https://sighttrue.com/pricing.

輸入參數names必填

base_image_check

For a container base image: its size, when it was last rebuilt, and whether the OS underneath it is still supported. Requires a key; see https://sighttrue.com/pricing.

輸入參數image必填

registry_health

Recorded outages of the package registries themselves, kept after their status pages drop them. Requires a key; see https://sighttrue.com/pricing.

輸入參數registry

provider_incidents

A provider’s recorded incidents, grouped by the component that failed, over the whole archive rather than the window its status page shows. Requires a key; see https://sighttrue.com/pricing.

輸入參數provider必填

provider_transparency

How long a provider takes to acknowledge an incident: the interval between an incident starting and its first public update. Requires a key; see https://sighttrue.com/pricing.

輸入參數provider

provider_terms_changed

When a provider last changed its terms or pricing page, from a stored fingerprint of the page. Requires a key; see https://sighttrue.com/pricing.

輸入參數provider

model_price_history

Every recorded price for a model, with the date each was read. Requires a key; see https://sighttrue.com/pricing.

輸入參數model必填

model_withdrawn

Models that were in the catalogue and no longer are, with the date last seen. Requires a key; see https://sighttrue.com/pricing.

無需輸入參數。

help_availability

For a technology tag: questions asked against questions answered, over time. Requires a key; see https://sighttrue.com/pricing.

輸入參數tag必填

audit_manifest

Read a whole manifest and return every reading on record for it, ordered by how much a reviewer would want to know. One call instead of one per dependency. Requires a key; see https://sighttrue.com/pricing.

輸入參數filenamemanifest必填

diff_since

What changed for a set of packages since a given date, read from the daily archive. Requires a key; see https://sighttrue.com/pricing.

輸入參數names必填since必填

watch_add

Add a package to the caller’s own private watchlist, so later readings are about their stack rather than the public one. The list is private to the key that created it. Requires a key; see https://sighttrue.com/pricing.

輸入參數name必填registry必填

watch_changes

Everything that has changed across the caller’s private watchlist since a given date: withdrawals, licence changes, advisories, archived repositories and runtimes going out of support. Requires a key; see https://sighttrue.com/pricing.

輸入參數since

explain_finding

Given a finding id, return what was measured, when, by whom, and the address it can be checked at. For an agent quoting a figure into a review. Requires a key; see https://sighttrue.com/pricing.

輸入參數id必填

domain_risk

Whether the domains a package points at — homepage, funding, documentation — still resolve to a registered owner. Requires a key; see https://sighttrue.com/pricing.

輸入參數name必填registry必填

版本歷史

1
  1. v1.0.0最新Sep 16, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分