Skip to content
KeychromPublic

About

Spica — a lightweight, sovereign ActivityPub server (Fediverse) in TypeScript. Runs on Node.js + SQLite alone, speaks the Misskey-compatible API, and federates with Mastodon/Misskey. Self-hostable in minutes. Currently in Beta.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

185 Commits

Folders and files

Repository files navigation

✦ Spica (スピカ)

自律分散とデータ主権のための、次世代 ActivityPub ノード
Misskey や Mastodon とシームレスにつながる、軽量かつ堅牢な国産ソーシャルネットワークエンジン。

⚠️ 現在は Beta 版(v0.2.0)です。主要な機能は実装済みで、実際のノードで運用しながら育てています。 仕様変更やデータの移行が起こることがあるので、大切なデータはバックアップを取ってから使ってください。

🌱 1 人の学生がメインで開発しているプロジェクトです。大人数でのテストができていないため、規模を大きくすると不安定になる可能性があります(詳しくは docs/SCALE.md)。

Version License: AGPL v3 ActivityPub Node.js TypeScript


🌟 Spica とは?

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 以上

1. リポジトリのクローン

git clone https://github.com/Keychrom/Spica.git
cd Spica

2. 依存パッケージのインストール

npm install

3. 設定ファイルの準備

cp .env.example .env

※ローカル開発の場合は、デフォルト設定のまま利用可能です。

4. 開発サーバーの起動

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 を相手サーバーに渡しません。

💬 DM(1対1のメッセージ)について

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 条に従い、対応するソースを利用者に提供してください(このリポジトリがその提供先になります)。

About

Spica — a lightweight, sovereign ActivityPub server (Fediverse) in TypeScript. Runs on Node.js + SQLite alone, speaks the Misskey-compatible API, and federates with Mastodon/Misskey. Self-hostable in minutes. Currently in Beta.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages