尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Mention is a social network for iOS, Android and the web, connected to the Fediverse.
Posts are signed records on a chain the author owns, not rows we can quietly rewrite.
One Bun workspace holding the whole product: an Expo client that ships to iOS, Android and the web from a single codebase, an Express API that also serves the web shell and the federation endpoints, the shared type contracts both sides compile against, and a remote MCP server so an AI assistant can read and post with your permission.檢視完整 README ↗One Bun workspace holding the whole product: an Expo client that ships to iOS, Android and the web from a single codebase, an Express API that also serves the web shell and the federation endpoints, the shared type contracts both sides compile against, and a remote MCP server so an AI assistant can read and post with your permission.
Mention owns posts, feeds, engagement, notifications, its own mutes and its federation state. It does not own you.
Identity, sessions and the social graph come from oxy, the platform every Oxy app stands on. The client mounts one OxyProvider from @oxy.so/services, the backend verifies requests with @oxy.so/core/server, and neither side hand rolls a token parser.
The interface is built with Bloom. Live audio rooms come from @syra.fm/sdk, the engine behind Syra, and load only when a room is opened.
| Package | Path | What it holds |
|---|---|---|
@mention/frontend | packages/frontend | Expo Router app for iOS, Android and web. Expo 57, React Native 0.86, React 19, NativeWind, TanStack Query, Zustand |
@mention/backend | packages/backend | Express 5 API over PostgreSQL (Drizzle ORM) and Valkey, Socket.IO, background workers, ActivityPub federation, the MTN signed record layer and the web shell |
@mention/shared-types | packages/shared-types | The request and response contracts, plus the MTN record schemas, that both sides compile against |
@mention/mcp | packages/mcp | Model Context Protocol server, remote over HTTP and local over stdio |
@mention/e2e | packages/e2e | Real browser release gate that exercises a candidate web build before it is promoted |
You need Bun 1.4.3, Node.js 24.21.0 for the Expo and Jest toolchains, and Docker with Compose for the local data plane. Xcode or Android Studio are needed only when you run the matching native target.
bun install --frozen-lockfile
bun run doctor
doctor checks the runtime, the workspace links and the pinned Expo, React, React Native, Bloom and shared types versions. It is worth running before you believe any other failure.
bun run dev # every workspace
bun run dev:frontend # Expo dev server
bun run dev:backend # API in watch mode
bun run dev:mcp # MCP over stdio
bun run dev:mcp:http # MCP over streamable HTTP, as production runs it
Run a specific native target from the frontend workspace:
bun run --cwd packages/frontend ios
bun run --cwd packages/frontend android
bun run --cwd packages/frontend web
The Compose stack is PostGIS-flavoured PostgreSQL, Valkey, and a one shot migration container. The backend starts only once Postgres and Valkey are healthy and migrations have finished:
docker compose up --build backend
Postgres and Valkey bind to loopback ports 5434 and 6379, and their data lives in the named postgres_data and valkey_data volumes. Port 5434 rather than 5433 on purpose: docker-compose.postgres.yml binds 5433 for the database that sits beside the test suite, and both stacks are routinely up at once.
For watch mode, start the dependencies only and run the backend on the host:
docker compose up -d postgres valkey
bun run dev:backend
Outside production the backend runs its own migrations before it reports ready.
bun run check # workspace validators, then build, then type checks
bun run build # shared-types, backend, MCP
bun run build:frontend # static Expo web export
bun run test # every workspace
bun run lint # Biome (format + lint), type checks, frontend Expo ESLint
bun run lint:fix # apply Biome's safe fixes and formatting
bun run format # format with Biome
Two things save time here. Rebuild shared-types before you trust a red type check, because every other package compiles against its built output and reports newly landed symbols as missing. And run backend tests from their own package root, cd packages/backend && bun run test, so stale compiled copies cannot be picked up.
Signed records (MTN)
Local posts are dual written to a per user hash chain built on @oxy.so/protocol. PostgreSQL stays authoritative for reads while the chain gives an author a verifiable, portable history. Native writes are signed on the device, web writes are signed custodially by the service, and a user can run their own node to hold their own chain.
Federation
External networks are a pluggable connector module rather than a hardcoded assumption. ActivityPub reaches Mastodon and the wider Fediverse. AT Protocol is read and discovery only, for resolving handles and mirroring profiles and posts. The core never knows a network exists.
Feeds and social surfaces
Following and For You feeds, custom feeds, lanes, channels, lists, starter packs, hashtags, topics, trending, polls, articles and collaborative posts. Ranking, classification and read surface safety gating live in the backend rather than in the client.
Moderation and AI access
Reports go to CrowdSource, which draws an independent jury, publishes a versioned decision and returns it by webhook. Mention decides what to enforce and nothing else. The MCP server lets Claude and other assistants act as you, with OAuth and per account linking.
| Document | Covers |
|---|---|
| Overview | Entry point, workspace responsibilities, data ownership |
| Architecture | How the pieces fit together |
| API | The HTTP surface |
| Fediverse | ActivityPub integration and discovery |
| Federation behaviors | Reposted-post shapes, bridge identity, thread federation, blocklist/purge, HLS media proxy |
| Channels and lanes | Channel-as-account design, disclosure, correction trail, lane curation |
| Moderation (CrowdSource) | Report intake, enforcement modes, the subject-provider seam, known gaps |
| Feed ranking | Content classification, safety gating, ranking signals, interstitials |
| Frontend compiler notes | React Compiler ref-write findings, web feed virtualization |
| Product positioning | What Mention is (and is not) as a product category |
| Performance budgets |
Instructions for AI coding agents live in AGENTS.md. The parent files it references apply as well.
Issues and pull requests are welcome. Please run bun run check and bun run test before opening one. Org wide contributing notes, the security policy and the code of conduct live in the organisation profile.
The Breathe License 1.0. Free to breathe, paid to bottle.
Free to run, read, modify, fork, and share, for any purpose that is not commercial. Two conditions on everyone: publish the source of what you deploy, and credit Oxy in one reachable place. Neither can be bought out of.
Commercial use requires a paid license. The trigger is revenue, including internal use inside a business that earns it. See the Commercial Terms. Paying buys the right to use it commercially; it does not let you keep your changes private and it does not remove attribution.
Cooperatives, nonprofits, educational institutions, and public bodies pay nothing. They publish source and attribute like everyone else. See the Exemption Policy.
The Breathe License is source available, not open source. It is not OSI
approved, because charging for commercial use is discrimination against a
field of endeavour under clause 6 of the Open Source Definition. Oxy's SDKs
and client libraries (@oxy.so/core, @oxy.so/services, Bloom) are
Apache-2.0, so building against Oxy carries none of this.
| What is measured today, what is instrumented but unheld, what is missing |
| Compose intent URLs | Linking into the composer from outside the app |
| User mentions | How handles resolve, local and federated |
| Theming | Bloom and NativeWind in this app |
| MCP server | Connecting Claude through central Oxy OAuth, account binding, and the tool list |
| Compatibility retirement | What we removed and why |