自律分散とデータ主権のための、次世代 ActivityPub ノード
Misskey や Mastodon とシームレスにつながる、軽量かつ堅牢な国産ソーシャルネットワークエンジン。
⚠️ 現在は Beta 版(v0.2.0)です。主要な機能は実装済みで、実際のノードで運用しながら育てています。 仕様変更やデータの移行が起こることがあるので、大切なデータはバックアップを取ってから使ってください。🌱 1 人の学生がメインで開発しているプロジェクトです。大人数でのテストができていないため、規模を大きくすると不安定になる可能性があります(詳しくは docs/SCALE.md)。
Spica は、W3C 標準規格 ActivityPub に完全準拠した自律分散型SNS(Fediverse)サーバーソフトウェアです。
世界中の Misskey、Mastodon、Firefish 等のサーバーと自由にフォロー・ノート送受信・リアクションの交換ができます。
重厚なミドルウェア(PostgreSQL や Redis など)を必要とせず、Node.js と SQLite (FTS5) だけで驚くほど軽量かつ高速に動作します。自宅サーバー、VPS、Raspberry Pi でも数分で自分専用の独立した主権型SNSノードを立ち上げることが可能です。
- 🌐 ActivityPub / Fediverse 完全相互運用 — ノート・返信・リノート・引用・リアクション・アンケート・CW。投稿は後から編集でき(連合先へ
Updateを配送)、編集した投稿には「編集済み」が付きます。WebFinger / NodeInfo / HTTP Signatures / リレーに対応し、配送失敗は指数バックオフで自動再送します。引っ越し(Move)と受信 Block の尊重にも対応。 - 🔑 データ主権 & マルチ認証 — マスターキー(パスワードレス)/メールアドレス+パスワード(管理画面で切替)/パスキー(WebAuthn)に加えて、任意の2段階認証(TOTP)。全データの JSON / ZIP エクスポートと、Mastodon・Misskey アーカイブの取り込み。
- 🔌 サードパーティ製クライアント — Misskey 互換 API を実装(MiAuth ログイン、タイムライン、ノートの読み書き・編集、スレッド / メンション、リアクション、お気に入り、ピン留め、通知と既読、フォロー / ミュート / ブロック、リスト、アンテナ、ドライブ、絵文字、WebSocket ストリーミング)。SubwayTooter や Miria などの Misskey 系クライアントから読み書きできます。
- 🗂️ メディアとドライブ — 画像は位置情報などを除去して WebP へ変換。S3 / Cloudflare R2 対応(ローカル保存も可)。アップロードは「ドライブ」で一覧・削除・容量管理でき、ffmpeg があれば動画サムネイルも自動生成します。
- 🔔 通知とリアルタイム更新 — SSE による即時配信と PWA / Web Push。通知は種類別に ON/OFF できます(フォロー・返信・メンション・リアクション・リノート・アンテナ・引っ越し)。
- 🔒 3段階の公開範囲 — 公開(連合配信)/ローカル限定/フォロワー限定。※DM(1対1のメッセージ)は既定でオフ(サーバー管理者が有効化したときだけ使えます。詳しくはこちら)。
- 🛡️ セキュリティとモデレーション — 署名検証(strict)・SSRF 対策・IP 単位のレート制限・ワードフィルター・鍵アカウント・通報(
Flag転送)・ドメインブロック。任意で Authorized Fetch(署名必須モード)。 - 🛠️ 1人でも回せる運用 —
npm run db:maintenanceでリモート投稿の整理・孤立メディアの削除・VACUUM・バックアップまで一括。既定はドライランで安全に確認できます。
📖 すべての機能は docs/FEATURES.md にまとめています。(投稿とタイムライン/メディアとドライブ/通知/認証/連合/セキュリティ/モデレーション/運用)
- Node.js: v22.13.0 以上(v24 推奨)。
node:sqliteを使うため、v22.5〜v22.12 / v23.0〜v23.3 では--experimental-sqliteが必要で、v20 以前では動作しません - npm: v9.0.0 以上
git clone https://github.com/Keychrom/Spica.git
cd Spicanpm installcp .env.example .env※ローカル開発の場合は、デフォルト設定のまま利用可能です。
npm run dev起動後、ブラウザで http://localhost:5173 にアクセスしてください。
Spicaの思想・アーキテクチャ、本番運用やサーバー設置に関する詳しいガイドは、以下のドキュメントをご覧ください:
- ✨ 機能一覧 (docs/FEATURES.md)
- 投稿・タイムライン、メディアとドライブ、通知、認証、連合、セキュリティ、モデレーション、運用の全機能
- 既定でオフの機能(DM 等)と、実装していない機能の方針
- 🌌 Spicaの仕組みと目指しているもの (docs/ABOUT_SPICA.md)
- 自立分散型ソーシャルネットワーク(Fediverse / ActivityPub)の仕組み
- 巨大テックの中央集権からの解放とデータ主権の理念
- 超軽量・自己完結型アーキテクチャ、暗号署名、パスキー生体認証、PWA
- 🪐 他の Fediverse ソフトとの違い (docs/FEDIVERSE-COMPARISON.md)
- Misskey / Mastodon / Akkoma / Iceshrimp.NET との仕様の差(リアクション・引用・検索・DM・文字数など)を一覧で比較
- それぞれが何を大事にしているか(哲学)と、Spica の立ち位置
- 連合していると実際に起きるズレ(👍 が ☆ に見える、Undo の形が違う、など)
- 🛠️ サーバー設置・導入ガイド (docs/SETUP.md) — 2 つの構成から選べます
- 🌱 通常構成 (docs/SETUP_Normal.md) — SQLite・1 プロセス(〜数十人。迷ったらこちら)
- 🐘 PostgreSQL + Redis 構成 (docs/SETUP_PostgreSQL_Redis.md) — 複数プロセス(数百人〜)
- Linux / Ubuntu サーバーへのセットアップ手順
- Nginx リバースプロキシ・SSL証明書(Let's Encrypt)の設定
- Cloudflare Tunnel での公開手順
- Cloudflare R2 / S3 ストレージの設定方法
- PM2 / systemd による自動起動・常駐化
- DB メンテナンスとバックアップ(
npm run db:maintenance/npm run db:pg:backup)
- 🔄 バージョンアップ手順書 (docs/UPGRADE.md)
git pullからの安全なアップデート手順- ゼロダウンタイム再起動とマイグレーション
- ⚙️ 設定リファレンス (docs/CONFIGURATION.md)
.envで設定可能なすべてのパラメータの詳細解説
- 🔌 Redis を使う (docs/REDIS.md)
- 複数プロセスで動かすための任意依存(レート制限・リアルタイム更新・設定の反映の共有)
- 既定では使いません(未設定なら今までどおりインメモリで動きます)
- 🌱 規模と安定性について (docs/SCALE.md)
- このプロジェクトは 1 人の学生がメインで開発しています。大人数でのテストはできていません
- なぜ大人数に向かないのか(既定は 1 プロセス・SQLite は 1 ライタ・整形のクエリ本数など)と、規模ごとの見通し
- 大人数で使う場合の緩和策と、まだ実装されていないこと
- 🏗 設計(プロセスと状態の置き場所) (docs/ARCHITECTURE.md)
- 役割を分けて動かす(
PROCESS_ROLE=web/worker)と、増やすときの前提 - 何がプロセスの外(DB・Redis)にあり、何が同じホストを要求するか
- 二重実行を防ぐ仕組みと、複数プロセスで静かに壊れる箇所の検査
- 役割を分けて動かす(
Spica/
├── server/ # バックエンド (Node.js / Express / TypeScript)
│ ├── src/
│ │ ├── routes/ # ActivityPub, WebFinger, REST API, Admin ルーティング
│ │ ├── db.ts # SQLite データベース層 (FTS5 全文検索, マイグレーション)
│ │ ├── activitypub.ts# 連合通信・HTTP署名検証・配信エンジン
│ │ ├── storage.ts # S3 / Cloudflare R2 / ローカルストレージ
│ │ ├── pushService.ts# Web Push (VAPID) 通知サービス
│ │ └── exportService.ts # データエクスポート (JSON / ZIP)
│ └── package.json
├── client/ # フロントエンド (React 19 + Vite + 自前 CSS のデザイントークン)
│ ├── src/ # SPA クライアント UI (タイムライン, 管理画面, PWA)
│ └── public/ # PWA マニフェスト, サービスワーカー, ロゴアセット
├── docs/ # 公式セットアップ・運用ドキュメント
└── scripts/ # テスト・検証用スクリプト群
- HTTP Signature 検証の強制: 受信した Activity は、署名鍵の持ち主と
actorの一致・ボディの Digest 一致・署名の鮮度をすべて検証し、失敗したものは 401 で拒否します(INBOX_SIGNATURE_MODE=strict、既定)。なりすまし投稿や改ざん・リプレイを防ぎます。署名鍵の取得先は SSRF 対策としてプライベートアドレス・内部ホスト名を拒否します。 - パスワードレス: パスワードの平文やハッシュの漏洩リスクがありません。
- データ主権: ユーザーが希望すればいつでも自身のアカウントと過去投稿を連合先(Fediverse)を含めて完全削除可能。
- データベース: 既定は SQLite(追加ミドルウェア不要。
node:sqliteの同期 API を 1 接続で使います)。大規模化したときのための PostgreSQL 対応はDB_DRIVER=postgres DATABASE_URL=...で有効になり、設計・移行手順・制約は docs/POSTGRESQL.md にまとめています(既定は SQLite のまま。データ層は非同期化済みで、どちらのドライバも同じコードで動きます)。 - 機密情報の保護: 本番環境の
.envや SQLite データベースファイルは Git 追跡から厳重に除外されています。さらにnpm run check:secretsが秘密鍵・API トークン・.env・SQLite の混入を検出し、npm install時に有効になる git フックが検出時はコミットを中止します。 - プライバシー(画像プロキシ): リモートのアイコンや添付画像は既定でこのノード経由で配信し、閲覧者の IP や User-Agent を相手サーバーに渡しません。
2026-10-07 に方針を変更しました。 それ以前は、1対1のメッセージ機能を提供するとノードの運営が「他人の通信を媒介する事業」と評価されうるため、運営者(個人であっても)が電気通信事業法上の義務(電気通信事業の届出・通信の秘密の保持・秘密の漏洩防止など)を負うおそれがある、という理由で方針として実装しないことにしていました。現在はこの点を踏まえたうえで、**サーバー管理者が明示的に有効化したときだけ使える機能(既定はオフ)**として実装しています。
Spica の DM は、連合する 1対1 のメッセージです(ActivityPub の direct 相当。Misskey の「ダイレクト」/ Mastodon の DM と同じ見え方になります)。
- 既定はオフ — サーバー管理者が**管理パネル →「サーバー設定」の「メッセージ(DM)を使う」**を on にしたときだけ使えます。**オフのときは API 自体が存在しない扱い(404)**になり、受信したメッセージも保存されません。有効化は運営者の判断で行います(有効にする前に下の注意書きを読んでください)。
- 受け取りは相手の許可リスト制 — 既定では誰からも受け取りません。設定 →「メッセージ」で許可した相手からのメッセージだけが届きます。
- サーバーに保存し、アプリ内通知のみ — 通知は届きますが、通知の本文にメッセージの内容は入りません。メール通知の対象外です(本文が外部のメール事業者を通らないようにしています)。
- 第三者には見えません — 宛先でない人には本文も存在も見えません。タイムライン・検索・RSS・sitemap・OGP・エクスポートには出ません。
利用者・運営者のみなさまへ:
- DM は端末間の暗号化(E2E)ではありません。 ノード運営者(サーバー管理者)はデータベースを直接参照できる立場にあるため、「運営者にも誰にも読まれない」という保証はありません。秘密にしたい内容は送らないでください。
- 「フォロワー限定」は DM ではありません。 承認したフォロワー全員が閲覧でき、連合先のフォロワーの Inbox にも配信されます。1対1の内緒の会話を想定したものではありません。
- 他の Fediverse サーバーに DM 機能があっても、Spica 側で DM が無効(既定)のときは送受信できません。また、相手側の許可リストに入っていないと届かないことがあります。
※ 上記は本プロジェクトの方針を説明するものであり、法的助言ではありません。個別の運用判断については、必要に応じて専門家にご確認ください。
本プロジェクトは AGPL-3.0-or-later(GNU Affero General Public License v3.0 以降)の下で公開されています。
LICENSE には正文(gnu.org の配布テキスト)をそのまま置いています。
Spica - a sovereign ActivityPub node
Copyright (C) 2026 Spica Project Contributors
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option) any
later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
- 2026-10-03 より前に公開された版は MIT License で提供されていました。その版を受け取った方は、その版を MIT の条件で使い続けられます。
- 改変した版をネットワーク越しに提供する場合は、AGPL 第 13 条に従い、対応するソースを利用者に提供してください(このリポジトリがその提供先になります)。