尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证kiwistand 是一个 p2p 节点客户端,面向 web3 的写作者友好型 Hacker News,既无人控制,又由所有人共同拥有。
AI 翻译
kiwistand is a p2p node client for a web3 writer friendly Hacker News that nobody controls but everybody co-owns
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Kiwistand is a P2P node client for a web3-friendly Hacker News that nobody controls but everybody co-owns.
Kiwi stores links and upvotes on the protocol level. Thanks to that, users can create their own UIs and permissionlessly create apps on top of it (see: awesome-kiwi for the list of apps and contributors).
You can learn the story behind the project in this 4 min video by Tim Daubenschutz.
• node >= 19 (best to check package.json value though)
• RPC nodes on Ethereum Mainnet & Optimism查看完整 README ↗This repository holds the code behind Kiwi News, a community-curated news site for crypto, Ethereum and builder-focused tech links, similar to Hacker News.
Every submission, upvote and comment on Kiwi News is a message signed with an Ethereum key. Nodes exchange these messages over an open peer-to-peer protocol, so all data is public and anyone can verify it. Anyone can run a node or build their own client on top of the same data. The package and protocol are called "kiwistand"; the site is called "Kiwi News".
To post, upvote or comment you connect an Ethereum wallet or create an account with a passkey (no wallet needed). You can add an application key so the site signs on your behalf without a wallet prompt for every action (see Protocol).
All read endpoints are public and need no authentication. CORS is open (Access-Control-Allow-Origin: *), so browser apps can call them directly.
/llms.txt: the main reference for developers and AI agents. It lists every endpoint, the response formats, how to cite Kiwi News, and how to sign and submit messages.GET /api/v1/feeds/hot, /api/v1/feeds/new, /api/v1/feeds/best?period=week: feeds as JSON (?page=0 paginates)GET /api/v1/stories?index=0x…: one story with its commentsGET /api/v1/profile/<address>: ENS name, avatar and social links of an addressGET /stories/context?index=0x…: one story as plain-text Markdown (title, source URL, extracted article text, comments), meant as LLM contextPOST /api/v1/messages, POST /api/v1/list, GET /api/v1/delegations); see llms.txt for the EIP-712 message format.Example:
curl https://news.kiwistand.com/api/v1/feeds/hot
There is also an HTTP API reference at https://attestate.com/kiwistand/main/.
kiwimcp-client/ is a Model Context Protocol server (published on npm as kiwimcp-client) that lets Claude Code and other MCP clients search Kiwi News, read feeds and stories with comments, and look up profiles and karma. Setup instructions are in kiwimcp-client/README.md.
engines in package.json; CI runs on 22.x)OPTIMISM_CRAWLER_RPC_HOSTS below).git clone https://github.com/attestate/kiwistand.git
cd kiwistand
cp .env-copy .env
mkdir anon cache
npm i
cd src/web && npm i && cd ../..
Then edit .env. The variables you have to set:
| Variable | Purpose |
|---|---|
OPTIMISM_RPC_HTTP_HOST | Optimism RPC URL (for example an Alchemy or Infura URL including your key) |
OPTIMISM_CRAWLER_RPC_HOSTS | Optional: comma-separated Optimism RPCs for the delegation crawler. The first is polled for new blocks; eth_getLogs rotates through all of them. |
RPC_HTTP_HOST | Ethereum mainnet RPC URL, for ENS |
DATA_DIR, CACHE_DIR | Where the message database (LMDB) and caches (SQLite and others) live; anon and cache by default |
The other values in .env-copy work as they are for local development. The social posting variables (X, Farcaster, Telegram) and Cloudflare keys are only needed on the production instance.
The dev:* scripts and watch override some variables from .env to run the node in a particular mode, and start it together with the Vite dev server for src/web.
| Script | What it does |
|---|---|
npm run dev:anon | Joins the live network: binds 0.0.0.0, peers with the public bootstrap node, uses DATA_DIR=anon. Site on port 4000, node API on 8443. |
npm run watch | Same settings as dev:anon, restarted by nodemon when src/views or src/http.mjs change. |
npm run dev:bootstrap | Runs a local bootstrap node (IS_BOOTSTRAP_NODE=true, binds 127.0.0.1, DATA_DIR=bootstrap) that does not connect to the live network. Site on port 80. |
npm run dev:anon:local | Binds 127.0.0.1 and peers only with a local bootstrap node, so nothing reaches the live network. Uses DATA_DIR=anonlocal, site on port 4001. |
npm run sync | Crawls the delegation events from Optimism into DATA_DIR. It keeps polling for new blocks; stop it once it repeats the same block range. |
npm run reconcile | Syncs with the chain and the peer-to-peer network with the website disabled (NODE_ENV=reconcile). |
npm run build | Builds the production frontend bundle into src/public. |
To try submitting stories, use dev:bootstrap together with dev:anon:local instead of the live network.
npm run sync to crawl the delegation events from Optimism.npm run reconcile to download all messages from peers. It logs Number of messages added: X as it stores messages.npm run dev:anon (or npm run watch) to run the node with the website.The first page loads of /, /new and /best after a full sync can be slow, because the node verifies and caches every message signature once.
contributing.md describes these steps in more detail.
npm run test:offline # what CI runs; skips tests that call the live site
npm test # all tests, including the MCP client and compression tests against the live site
.github/workflows/deploy.yml runs the offline tests on every push to main and, when the DEPLOY_ENABLED repository variable is "true", builds the frontend and rsyncs it to the production server, the same as npm run deploy does by hand.
More detail:
Protocol and breaking changes are listed in changelog.md.
GPL-3.0-only, see LICENSE. The MCP client in kiwimcp-client/ is MIT-licensed according to its package.json.