From 6990568baf0f6f1af7ab26964bd0a6aa383597ba Mon Sep 17 00:00:00 2001
From: cyph3rasi
Date: Wed, 15 Jul 2026 09:53:59 -0700
Subject: [PATCH] Add live network totals for nodes, users, published media,
and posts, including local-node counts and media-count federation support.
Hop-State: A_06FPDCRHF0BSN8BDYYXW3ER
Hop-Proposal: R_06FPDCQJTBM7EZK7BXFA8D0
Hop-Task: T_06FPD59337GBJTP7D756FEG
Hop-Attempt: AT_06FPD59337493XRD47TM0H0
---
.../20260715164907_hot_darwin/migration.sql | 1 +
.../20260715164907_hot_darwin/snapshot.json | 7202 +++++++++++++++++
src/app/api/swarm/announce/route.ts | 5 +-
src/app/api/swarm/gossip/route.ts | 5 +-
src/app/api/swarm/info/route.ts | 1 +
src/components/RightSidebar.tsx | 41 +-
src/db/schema.ts | 1 +
src/lib/swarm/discovery.ts | 11 +-
src/lib/swarm/gossip.ts | 1 +
src/lib/swarm/registry.ts | 62 +-
src/lib/swarm/stats.test.ts | 42 +
src/lib/swarm/types.ts | 3 +
12 files changed, 7358 insertions(+), 17 deletions(-)
create mode 100644 drizzle/20260715164907_hot_darwin/migration.sql
create mode 100644 drizzle/20260715164907_hot_darwin/snapshot.json
create mode 100644 src/lib/swarm/stats.test.ts
diff --git a/drizzle/20260715164907_hot_darwin/migration.sql b/drizzle/20260715164907_hot_darwin/migration.sql
new file mode 100644
index 0000000..ea91dfd
--- /dev/null
+++ b/drizzle/20260715164907_hot_darwin/migration.sql
@@ -0,0 +1 @@
+ALTER TABLE `swarm_nodes` ADD `media_count` integer;
\ No newline at end of file
diff --git a/drizzle/20260715164907_hot_darwin/snapshot.json b/drizzle/20260715164907_hot_darwin/snapshot.json
new file mode 100644
index 0000000..1f9adfe
--- /dev/null
+++ b/drizzle/20260715164907_hot_darwin/snapshot.json
@@ -0,0 +1,7202 @@
+{
+ "version": "7",
+ "dialect": "sqlite",
+ "id": "eacbe50b-bb47-41dc-b591-b3098e9859e6",
+ "prevIds": [
+ "f2dee26d-ac08-4b7b-b708-d5d737b8866c"
+ ],
+ "ddl": [
+ {
+ "name": "blocks",
+ "entityType": "tables"
+ },
+ {
+ "name": "bot_activity_logs",
+ "entityType": "tables"
+ },
+ {
+ "name": "bot_content_items",
+ "entityType": "tables"
+ },
+ {
+ "name": "bot_content_sources",
+ "entityType": "tables"
+ },
+ {
+ "name": "bot_mentions",
+ "entityType": "tables"
+ },
+ {
+ "name": "bot_rate_limits",
+ "entityType": "tables"
+ },
+ {
+ "name": "bots",
+ "entityType": "tables"
+ },
+ {
+ "name": "chat_conversations",
+ "entityType": "tables"
+ },
+ {
+ "name": "chat_messages",
+ "entityType": "tables"
+ },
+ {
+ "name": "chat_typing_indicators",
+ "entityType": "tables"
+ },
+ {
+ "name": "e2ee_key_bundles",
+ "entityType": "tables"
+ },
+ {
+ "name": "e2ee_key_vaults",
+ "entityType": "tables"
+ },
+ {
+ "name": "e2ee_message_receipts",
+ "entityType": "tables"
+ },
+ {
+ "name": "e2ee_remote_key_bundles",
+ "entityType": "tables"
+ },
+ {
+ "name": "follows",
+ "entityType": "tables"
+ },
+ {
+ "name": "handle_registry",
+ "entityType": "tables"
+ },
+ {
+ "name": "likes",
+ "entityType": "tables"
+ },
+ {
+ "name": "media",
+ "entityType": "tables"
+ },
+ {
+ "name": "muted_nodes",
+ "entityType": "tables"
+ },
+ {
+ "name": "mutes",
+ "entityType": "tables"
+ },
+ {
+ "name": "nodes",
+ "entityType": "tables"
+ },
+ {
+ "name": "notifications",
+ "entityType": "tables"
+ },
+ {
+ "name": "posts",
+ "entityType": "tables"
+ },
+ {
+ "name": "remote_followers",
+ "entityType": "tables"
+ },
+ {
+ "name": "remote_follows",
+ "entityType": "tables"
+ },
+ {
+ "name": "remote_identity_cache",
+ "entityType": "tables"
+ },
+ {
+ "name": "remote_likes",
+ "entityType": "tables"
+ },
+ {
+ "name": "remote_posts",
+ "entityType": "tables"
+ },
+ {
+ "name": "remote_reposts",
+ "entityType": "tables"
+ },
+ {
+ "name": "reports",
+ "entityType": "tables"
+ },
+ {
+ "name": "sessions",
+ "entityType": "tables"
+ },
+ {
+ "name": "signed_action_dedupe",
+ "entityType": "tables"
+ },
+ {
+ "name": "stuffbox_connections",
+ "entityType": "tables"
+ },
+ {
+ "name": "swarm_nodes",
+ "entityType": "tables"
+ },
+ {
+ "name": "swarm_seeds",
+ "entityType": "tables"
+ },
+ {
+ "name": "swarm_sync_log",
+ "entityType": "tables"
+ },
+ {
+ "name": "user_swarm_likes",
+ "entityType": "tables"
+ },
+ {
+ "name": "user_swarm_reposts",
+ "entityType": "tables"
+ },
+ {
+ "name": "users",
+ "entityType": "tables"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "blocks"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "blocks"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "blocked_user_id",
+ "entityType": "columns",
+ "table": "blocks"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "blocks"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "bot_activity_logs"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "bot_id",
+ "entityType": "columns",
+ "table": "bot_activity_logs"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "action",
+ "entityType": "columns",
+ "table": "bot_activity_logs"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "details",
+ "entityType": "columns",
+ "table": "bot_activity_logs"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "success",
+ "entityType": "columns",
+ "table": "bot_activity_logs"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "error_message",
+ "entityType": "columns",
+ "table": "bot_activity_logs"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "bot_activity_logs"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "source_id",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "external_id",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "title",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "content",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "url",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "published_at",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "fetched_at",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_processed",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "processed_at",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "post_id",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "interest_score",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "interest_reason",
+ "entityType": "columns",
+ "table": "bot_content_items"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "bot_id",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "url",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "subreddit",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "api_key_encrypted",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "source_config",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "keywords",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "true",
+ "generated": null,
+ "name": "is_active",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "last_fetch_at",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "last_error",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "consecutive_errors",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "updated_at",
+ "entityType": "columns",
+ "table": "bot_content_sources"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "bot_mentions"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "bot_id",
+ "entityType": "columns",
+ "table": "bot_mentions"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "post_id",
+ "entityType": "columns",
+ "table": "bot_mentions"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "author_id",
+ "entityType": "columns",
+ "table": "bot_mentions"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "content",
+ "entityType": "columns",
+ "table": "bot_mentions"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_processed",
+ "entityType": "columns",
+ "table": "bot_mentions"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "processed_at",
+ "entityType": "columns",
+ "table": "bot_mentions"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "response_post_id",
+ "entityType": "columns",
+ "table": "bot_mentions"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_remote",
+ "entityType": "columns",
+ "table": "bot_mentions"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "remote_actor_url",
+ "entityType": "columns",
+ "table": "bot_mentions"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "bot_mentions"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "bot_rate_limits"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "bot_id",
+ "entityType": "columns",
+ "table": "bot_rate_limits"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "window_start",
+ "entityType": "columns",
+ "table": "bot_rate_limits"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "window_type",
+ "entityType": "columns",
+ "table": "bot_rate_limits"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "post_count",
+ "entityType": "columns",
+ "table": "bot_rate_limits"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "reply_count",
+ "entityType": "columns",
+ "table": "bot_rate_limits"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "bot_rate_limits"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "owner_id",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "personality_config",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "llm_provider",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "llm_model",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "llm_endpoint",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "llm_api_key_encrypted",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "schedule_config",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "autonomous_mode",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "true",
+ "generated": null,
+ "name": "is_active",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_suspended",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "suspension_reason",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "suspended_at",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "last_post_at",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "updated_at",
+ "entityType": "columns",
+ "table": "bots"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "chat_conversations"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "'direct'",
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "chat_conversations"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "participant1_id",
+ "entityType": "columns",
+ "table": "chat_conversations"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "participant2_handle",
+ "entityType": "columns",
+ "table": "chat_conversations"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "last_message_at",
+ "entityType": "columns",
+ "table": "chat_conversations"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "last_message_preview",
+ "entityType": "columns",
+ "table": "chat_conversations"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "'legacy'",
+ "generated": null,
+ "name": "encryption_mode",
+ "entityType": "columns",
+ "table": "chat_conversations"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "e2ee_activated_at",
+ "entityType": "columns",
+ "table": "chat_conversations"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "chat_conversations"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "updated_at",
+ "entityType": "columns",
+ "table": "chat_conversations"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "conversation_id",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "sender_handle",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "sender_display_name",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "sender_avatar_url",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "sender_node_domain",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "sender_did",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "content",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "protocol_version",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "client_message_id",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "encrypted_envelope",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "e2ee_signature",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "e2ee_action_nonce",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "e2ee_action_ts",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "swarm_message_id",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "delivered_at",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "read_at",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "chat_messages"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "chat_typing_indicators"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "conversation_id",
+ "entityType": "columns",
+ "table": "chat_typing_indicators"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_handle",
+ "entityType": "columns",
+ "table": "chat_typing_indicators"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "expires_at",
+ "entityType": "columns",
+ "table": "chat_typing_indicators"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "chat_typing_indicators"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "e2ee_key_bundles"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "did",
+ "entityType": "columns",
+ "table": "e2ee_key_bundles"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "e2ee_key_bundles"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "key_version",
+ "entityType": "columns",
+ "table": "e2ee_key_bundles"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "public_key",
+ "entityType": "columns",
+ "table": "e2ee_key_bundles"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "proof_action",
+ "entityType": "columns",
+ "table": "e2ee_key_bundles"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "e2ee_key_bundles"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "updated_at",
+ "entityType": "columns",
+ "table": "e2ee_key_bundles"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "key_version",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "owner_did",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "public_key",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "ciphertext",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "nonce",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "salt",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "kdf_algorithm",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "kdf_ops_limit",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "kdf_mem_limit",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "pin_verifier_mac",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "server_share_encrypted",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "failed_attempts",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "locked_until",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "updated_at",
+ "entityType": "columns",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "e2ee_message_receipts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "owner_user_id",
+ "entityType": "columns",
+ "table": "e2ee_message_receipts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "sender_did",
+ "entityType": "columns",
+ "table": "e2ee_message_receipts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "message_id",
+ "entityType": "columns",
+ "table": "e2ee_message_receipts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "1",
+ "generated": null,
+ "name": "protocol_version",
+ "entityType": "columns",
+ "table": "e2ee_message_receipts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "received_at",
+ "entityType": "columns",
+ "table": "e2ee_message_receipts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "did",
+ "entityType": "columns",
+ "table": "e2ee_remote_key_bundles"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "handle",
+ "entityType": "columns",
+ "table": "e2ee_remote_key_bundles"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "key_id",
+ "entityType": "columns",
+ "table": "e2ee_remote_key_bundles"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "key_version",
+ "entityType": "columns",
+ "table": "e2ee_remote_key_bundles"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "public_key",
+ "entityType": "columns",
+ "table": "e2ee_remote_key_bundles"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "proof_action",
+ "entityType": "columns",
+ "table": "e2ee_remote_key_bundles"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "signing_public_key",
+ "entityType": "columns",
+ "table": "e2ee_remote_key_bundles"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "first_seen_at",
+ "entityType": "columns",
+ "table": "e2ee_remote_key_bundles"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "updated_at",
+ "entityType": "columns",
+ "table": "e2ee_remote_key_bundles"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "follows"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "follower_id",
+ "entityType": "columns",
+ "table": "follows"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "following_id",
+ "entityType": "columns",
+ "table": "follows"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "ap_id",
+ "entityType": "columns",
+ "table": "follows"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "pending",
+ "entityType": "columns",
+ "table": "follows"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "follows"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "handle",
+ "entityType": "columns",
+ "table": "handle_registry"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "did",
+ "entityType": "columns",
+ "table": "handle_registry"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "node_domain",
+ "entityType": "columns",
+ "table": "handle_registry"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "registered_at",
+ "entityType": "columns",
+ "table": "handle_registry"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "updated_at",
+ "entityType": "columns",
+ "table": "handle_registry"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "likes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "likes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "post_id",
+ "entityType": "columns",
+ "table": "likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "ap_id",
+ "entityType": "columns",
+ "table": "likes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "media"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "media"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "post_id",
+ "entityType": "columns",
+ "table": "media"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "url",
+ "entityType": "columns",
+ "table": "media"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "storage_provider",
+ "entityType": "columns",
+ "table": "media"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "storage_asset_id",
+ "entityType": "columns",
+ "table": "media"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "alt_text",
+ "entityType": "columns",
+ "table": "media"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "mime_type",
+ "entityType": "columns",
+ "table": "media"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "width",
+ "entityType": "columns",
+ "table": "media"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "height",
+ "entityType": "columns",
+ "table": "media"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "media"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "muted_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "muted_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "node_domain",
+ "entityType": "columns",
+ "table": "muted_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "muted_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "mutes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "mutes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "muted_user_id",
+ "entityType": "columns",
+ "table": "mutes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "mutes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "domain",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "description",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "long_description",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "rules",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "banner_url",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "logo_url",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "favicon_url",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "logo_data",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "favicon_data",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": "'#FFFFFF'",
+ "generated": null,
+ "name": "accent_color",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "public_key",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "private_key_encrypted",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_nsfw",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "turnstile_site_key",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "turnstile_secret_key",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "updated_at",
+ "entityType": "columns",
+ "table": "nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "actor_id",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "actor_handle",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "actor_display_name",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "actor_avatar_url",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "actor_node_domain",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "target_handle",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "target_display_name",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "target_avatar_url",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "target_node_domain",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "target_is_bot",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "post_id",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "post_content",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "type",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "read_at",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "notifications"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "bot_id",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "content",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "reply_to_id",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "repost_of_id",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "swarm_reply_to_id",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "swarm_reply_to_content",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "swarm_reply_to_author",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "likes_count",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "reposts_count",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "replies_count",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_nsfw",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_removed",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "removed_at",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "removed_by",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "removed_reason",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "ap_id",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "ap_url",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_url",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_title",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_description",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_image",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_type",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_video_url",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_media_json",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "updated_at",
+ "entityType": "columns",
+ "table": "posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "remote_followers"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "remote_followers"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "actor_url",
+ "entityType": "columns",
+ "table": "remote_followers"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "inbox_url",
+ "entityType": "columns",
+ "table": "remote_followers"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "shared_inbox_url",
+ "entityType": "columns",
+ "table": "remote_followers"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "handle",
+ "entityType": "columns",
+ "table": "remote_followers"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "activity_id",
+ "entityType": "columns",
+ "table": "remote_followers"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "remote_followers"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "remote_follows"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "follower_id",
+ "entityType": "columns",
+ "table": "remote_follows"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "target_handle",
+ "entityType": "columns",
+ "table": "remote_follows"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "target_actor_url",
+ "entityType": "columns",
+ "table": "remote_follows"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "inbox_url",
+ "entityType": "columns",
+ "table": "remote_follows"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "activity_id",
+ "entityType": "columns",
+ "table": "remote_follows"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "display_name",
+ "entityType": "columns",
+ "table": "remote_follows"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "bio",
+ "entityType": "columns",
+ "table": "remote_follows"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "avatar_url",
+ "entityType": "columns",
+ "table": "remote_follows"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "remote_follows"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "did",
+ "entityType": "columns",
+ "table": "remote_identity_cache"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "public_key",
+ "entityType": "columns",
+ "table": "remote_identity_cache"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "fetched_at",
+ "entityType": "columns",
+ "table": "remote_identity_cache"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "expires_at",
+ "entityType": "columns",
+ "table": "remote_identity_cache"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "remote_likes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "post_id",
+ "entityType": "columns",
+ "table": "remote_likes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "actor_handle",
+ "entityType": "columns",
+ "table": "remote_likes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "actor_node_domain",
+ "entityType": "columns",
+ "table": "remote_likes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "remote_likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "ap_id",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "author_handle",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "author_actor_url",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "author_display_name",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "author_avatar_url",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "content",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "published_at",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_url",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_title",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_description",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_image",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_type",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_video_url",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_media_json",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "media_json",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "fetched_at",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "remote_posts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "remote_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "post_id",
+ "entityType": "columns",
+ "table": "remote_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "actor_handle",
+ "entityType": "columns",
+ "table": "remote_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "actor_node_domain",
+ "entityType": "columns",
+ "table": "remote_reposts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "remote_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "reports"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "reporter_id",
+ "entityType": "columns",
+ "table": "reports"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "target_type",
+ "entityType": "columns",
+ "table": "reports"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "target_id",
+ "entityType": "columns",
+ "table": "reports"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "reason",
+ "entityType": "columns",
+ "table": "reports"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "'open'",
+ "generated": null,
+ "name": "status",
+ "entityType": "columns",
+ "table": "reports"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "resolved_at",
+ "entityType": "columns",
+ "table": "reports"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "resolved_by",
+ "entityType": "columns",
+ "table": "reports"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "resolution_note",
+ "entityType": "columns",
+ "table": "reports"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "reports"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "sessions"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "sessions"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "token",
+ "entityType": "columns",
+ "table": "sessions"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "expires_at",
+ "entityType": "columns",
+ "table": "sessions"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "sessions"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "action_id",
+ "entityType": "columns",
+ "table": "signed_action_dedupe"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "did",
+ "entityType": "columns",
+ "table": "signed_action_dedupe"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "nonce",
+ "entityType": "columns",
+ "table": "signed_action_dedupe"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "ts",
+ "entityType": "columns",
+ "table": "signed_action_dedupe"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "signed_action_dedupe"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "stuffbox_connections"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "base_url",
+ "entityType": "columns",
+ "table": "stuffbox_connections"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "access_token_encrypted",
+ "entityType": "columns",
+ "table": "stuffbox_connections"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "access_token_expires_at",
+ "entityType": "columns",
+ "table": "stuffbox_connections"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "refresh_token_encrypted",
+ "entityType": "columns",
+ "table": "stuffbox_connections"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "refresh_token_expires_at",
+ "entityType": "columns",
+ "table": "stuffbox_connections"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "scopes",
+ "entityType": "columns",
+ "table": "stuffbox_connections"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "connected_at",
+ "entityType": "columns",
+ "table": "stuffbox_connections"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "updated_at",
+ "entityType": "columns",
+ "table": "stuffbox_connections"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "domain",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "name",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "description",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "logo_url",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "public_key",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "software_version",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_count",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "post_count",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "media_count",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_nsfw",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "discovered_via",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "discovered_at",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "last_seen_at",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "last_sync_at",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "consecutive_failures",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "true",
+ "generated": null,
+ "name": "is_active",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "50",
+ "generated": null,
+ "name": "trust_score",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_blocked",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "block_reason",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "blocked_at",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "capabilities",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "updated_at",
+ "entityType": "columns",
+ "table": "swarm_nodes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "swarm_seeds"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "domain",
+ "entityType": "columns",
+ "table": "swarm_seeds"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "100",
+ "generated": null,
+ "name": "priority",
+ "entityType": "columns",
+ "table": "swarm_seeds"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "true",
+ "generated": null,
+ "name": "is_enabled",
+ "entityType": "columns",
+ "table": "swarm_seeds"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "last_contact_at",
+ "entityType": "columns",
+ "table": "swarm_seeds"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "consecutive_failures",
+ "entityType": "columns",
+ "table": "swarm_seeds"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "swarm_seeds"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "swarm_sync_log"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "remote_domain",
+ "entityType": "columns",
+ "table": "swarm_sync_log"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "direction",
+ "entityType": "columns",
+ "table": "swarm_sync_log"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "nodes_received",
+ "entityType": "columns",
+ "table": "swarm_sync_log"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "nodes_sent",
+ "entityType": "columns",
+ "table": "swarm_sync_log"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "handles_received",
+ "entityType": "columns",
+ "table": "swarm_sync_log"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "handles_sent",
+ "entityType": "columns",
+ "table": "swarm_sync_log"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "success",
+ "entityType": "columns",
+ "table": "swarm_sync_log"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "error_message",
+ "entityType": "columns",
+ "table": "swarm_sync_log"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "duration_ms",
+ "entityType": "columns",
+ "table": "swarm_sync_log"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "swarm_sync_log"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "node_domain",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "original_post_id",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "author_handle",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "author_display_name",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "author_avatar_url",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "content",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "post_created_at",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "likes_count",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "reposts_count",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "replies_count",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_url",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_title",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_description",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_image",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_type",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_video_url",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_media_json",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "media_json",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "liked_at",
+ "entityType": "columns",
+ "table": "user_swarm_likes"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "user_id",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "node_domain",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "original_post_id",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "author_handle",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "author_display_name",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "author_avatar_url",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "content",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "post_created_at",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "likes_count",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "reposts_count",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "replies_count",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_url",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_title",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_description",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_image",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_type",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_video_url",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "link_preview_media_json",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "media_json",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "reposted_at",
+ "entityType": "columns",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "id",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "did",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "handle",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "email",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "password_hash",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "display_name",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "bio",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "avatar_url",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "header_url",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "private_key_encrypted",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "public_key",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "node_id",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_bot",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "bot_owner_id",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_nsfw",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "nsfw_enabled",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "age_verified_at",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_suspended",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "suspension_reason",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "suspended_at",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "false",
+ "generated": null,
+ "name": "is_silenced",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "silence_reason",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "silenced_at",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "moved_to",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "moved_from",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "migrated_at",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "storage_provider",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "storage_endpoint",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "storage_public_base_url",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "storage_region",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "storage_bucket",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "storage_access_key_encrypted",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "storage_secret_key_encrypted",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "followers_count",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "following_count",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "0",
+ "generated": null,
+ "name": "posts_count",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": false,
+ "autoincrement": false,
+ "default": null,
+ "generated": null,
+ "name": "website",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "text",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "'everyone'",
+ "generated": null,
+ "name": "dm_privacy",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "created_at",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "type": "integer",
+ "notNull": true,
+ "autoincrement": false,
+ "default": "(unixepoch())",
+ "generated": null,
+ "name": "updated_at",
+ "entityType": "columns",
+ "table": "users"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_blocks_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "blocks"
+ },
+ {
+ "columns": [
+ "blocked_user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_blocks_blocked_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "blocks"
+ },
+ {
+ "columns": [
+ "bot_id"
+ ],
+ "tableTo": "bots",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_bot_activity_logs_bot_id_bots_id_fk",
+ "entityType": "fks",
+ "table": "bot_activity_logs"
+ },
+ {
+ "columns": [
+ "source_id"
+ ],
+ "tableTo": "bot_content_sources",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_bot_content_items_source_id_bot_content_sources_id_fk",
+ "entityType": "fks",
+ "table": "bot_content_items"
+ },
+ {
+ "columns": [
+ "post_id"
+ ],
+ "tableTo": "posts",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "SET NULL",
+ "nameExplicit": false,
+ "name": "fk_bot_content_items_post_id_posts_id_fk",
+ "entityType": "fks",
+ "table": "bot_content_items"
+ },
+ {
+ "columns": [
+ "bot_id"
+ ],
+ "tableTo": "bots",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_bot_content_sources_bot_id_bots_id_fk",
+ "entityType": "fks",
+ "table": "bot_content_sources"
+ },
+ {
+ "columns": [
+ "bot_id"
+ ],
+ "tableTo": "bots",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_bot_mentions_bot_id_bots_id_fk",
+ "entityType": "fks",
+ "table": "bot_mentions"
+ },
+ {
+ "columns": [
+ "post_id"
+ ],
+ "tableTo": "posts",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_bot_mentions_post_id_posts_id_fk",
+ "entityType": "fks",
+ "table": "bot_mentions"
+ },
+ {
+ "columns": [
+ "author_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "NO ACTION",
+ "nameExplicit": false,
+ "name": "fk_bot_mentions_author_id_users_id_fk",
+ "entityType": "fks",
+ "table": "bot_mentions"
+ },
+ {
+ "columns": [
+ "response_post_id"
+ ],
+ "tableTo": "posts",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "NO ACTION",
+ "nameExplicit": false,
+ "name": "fk_bot_mentions_response_post_id_posts_id_fk",
+ "entityType": "fks",
+ "table": "bot_mentions"
+ },
+ {
+ "columns": [
+ "bot_id"
+ ],
+ "tableTo": "bots",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_bot_rate_limits_bot_id_bots_id_fk",
+ "entityType": "fks",
+ "table": "bot_rate_limits"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_bots_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "bots"
+ },
+ {
+ "columns": [
+ "owner_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_bots_owner_id_users_id_fk",
+ "entityType": "fks",
+ "table": "bots"
+ },
+ {
+ "columns": [
+ "participant1_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_chat_conversations_participant1_id_users_id_fk",
+ "entityType": "fks",
+ "table": "chat_conversations"
+ },
+ {
+ "columns": [
+ "conversation_id"
+ ],
+ "tableTo": "chat_conversations",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_chat_messages_conversation_id_chat_conversations_id_fk",
+ "entityType": "fks",
+ "table": "chat_messages"
+ },
+ {
+ "columns": [
+ "conversation_id"
+ ],
+ "tableTo": "chat_conversations",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_chat_typing_indicators_conversation_id_chat_conversations_id_fk",
+ "entityType": "fks",
+ "table": "chat_typing_indicators"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_e2ee_key_bundles_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "e2ee_key_bundles"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_e2ee_key_vaults_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "columns": [
+ "owner_user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_e2ee_message_receipts_owner_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "e2ee_message_receipts"
+ },
+ {
+ "columns": [
+ "follower_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_follows_follower_id_users_id_fk",
+ "entityType": "fks",
+ "table": "follows"
+ },
+ {
+ "columns": [
+ "following_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_follows_following_id_users_id_fk",
+ "entityType": "fks",
+ "table": "follows"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_likes_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "likes"
+ },
+ {
+ "columns": [
+ "post_id"
+ ],
+ "tableTo": "posts",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_likes_post_id_posts_id_fk",
+ "entityType": "fks",
+ "table": "likes"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_media_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "media"
+ },
+ {
+ "columns": [
+ "post_id"
+ ],
+ "tableTo": "posts",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_media_post_id_posts_id_fk",
+ "entityType": "fks",
+ "table": "media"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_muted_nodes_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "muted_nodes"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_mutes_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "mutes"
+ },
+ {
+ "columns": [
+ "muted_user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_mutes_muted_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "mutes"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_notifications_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "notifications"
+ },
+ {
+ "columns": [
+ "actor_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_notifications_actor_id_users_id_fk",
+ "entityType": "fks",
+ "table": "notifications"
+ },
+ {
+ "columns": [
+ "post_id"
+ ],
+ "tableTo": "posts",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_notifications_post_id_posts_id_fk",
+ "entityType": "fks",
+ "table": "notifications"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_posts_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "posts"
+ },
+ {
+ "columns": [
+ "bot_id"
+ ],
+ "tableTo": "bots",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "SET NULL",
+ "nameExplicit": false,
+ "name": "fk_posts_bot_id_bots_id_fk",
+ "entityType": "fks",
+ "table": "posts"
+ },
+ {
+ "columns": [
+ "removed_by"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "NO ACTION",
+ "nameExplicit": false,
+ "name": "fk_posts_removed_by_users_id_fk",
+ "entityType": "fks",
+ "table": "posts"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_remote_followers_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "remote_followers"
+ },
+ {
+ "columns": [
+ "follower_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_remote_follows_follower_id_users_id_fk",
+ "entityType": "fks",
+ "table": "remote_follows"
+ },
+ {
+ "columns": [
+ "post_id"
+ ],
+ "tableTo": "posts",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_remote_likes_post_id_posts_id_fk",
+ "entityType": "fks",
+ "table": "remote_likes"
+ },
+ {
+ "columns": [
+ "post_id"
+ ],
+ "tableTo": "posts",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_remote_reposts_post_id_posts_id_fk",
+ "entityType": "fks",
+ "table": "remote_reposts"
+ },
+ {
+ "columns": [
+ "reporter_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "SET NULL",
+ "nameExplicit": false,
+ "name": "fk_reports_reporter_id_users_id_fk",
+ "entityType": "fks",
+ "table": "reports"
+ },
+ {
+ "columns": [
+ "resolved_by"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "NO ACTION",
+ "nameExplicit": false,
+ "name": "fk_reports_resolved_by_users_id_fk",
+ "entityType": "fks",
+ "table": "reports"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_sessions_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "sessions"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_stuffbox_connections_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "stuffbox_connections"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_user_swarm_likes_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "user_swarm_likes"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": false,
+ "name": "fk_user_swarm_reposts_user_id_users_id_fk",
+ "entityType": "fks",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "columns": [
+ "node_id"
+ ],
+ "tableTo": "nodes",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "NO ACTION",
+ "nameExplicit": false,
+ "name": "fk_users_node_id_nodes_id_fk",
+ "entityType": "fks",
+ "table": "users"
+ },
+ {
+ "columns": [
+ "bot_owner_id"
+ ],
+ "tableTo": "users",
+ "columnsTo": [
+ "id"
+ ],
+ "onUpdate": "NO ACTION",
+ "onDelete": "CASCADE",
+ "nameExplicit": true,
+ "name": "users_bot_owner_id_users_id_fk",
+ "entityType": "fks",
+ "table": "users"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "blocks_pk",
+ "table": "blocks",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "bot_activity_logs_pk",
+ "table": "bot_activity_logs",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "bot_content_items_pk",
+ "table": "bot_content_items",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "bot_content_sources_pk",
+ "table": "bot_content_sources",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "bot_mentions_pk",
+ "table": "bot_mentions",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "bot_rate_limits_pk",
+ "table": "bot_rate_limits",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "bots_pk",
+ "table": "bots",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "chat_conversations_pk",
+ "table": "chat_conversations",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "chat_messages_pk",
+ "table": "chat_messages",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "chat_typing_indicators_pk",
+ "table": "chat_typing_indicators",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "nameExplicit": false,
+ "name": "e2ee_key_bundles_pk",
+ "table": "e2ee_key_bundles",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "nameExplicit": false,
+ "name": "e2ee_key_vaults_pk",
+ "table": "e2ee_key_vaults",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "e2ee_message_receipts_pk",
+ "table": "e2ee_message_receipts",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "did"
+ ],
+ "nameExplicit": false,
+ "name": "e2ee_remote_key_bundles_pk",
+ "table": "e2ee_remote_key_bundles",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "follows_pk",
+ "table": "follows",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "handle"
+ ],
+ "nameExplicit": false,
+ "name": "handle_registry_pk",
+ "table": "handle_registry",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "likes_pk",
+ "table": "likes",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "media_pk",
+ "table": "media",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "muted_nodes_pk",
+ "table": "muted_nodes",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "mutes_pk",
+ "table": "mutes",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "nodes_pk",
+ "table": "nodes",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "notifications_pk",
+ "table": "notifications",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "posts_pk",
+ "table": "posts",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "remote_followers_pk",
+ "table": "remote_followers",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "remote_follows_pk",
+ "table": "remote_follows",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "did"
+ ],
+ "nameExplicit": false,
+ "name": "remote_identity_cache_pk",
+ "table": "remote_identity_cache",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "remote_likes_pk",
+ "table": "remote_likes",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "remote_posts_pk",
+ "table": "remote_posts",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "remote_reposts_pk",
+ "table": "remote_reposts",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "reports_pk",
+ "table": "reports",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "sessions_pk",
+ "table": "sessions",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "action_id"
+ ],
+ "nameExplicit": false,
+ "name": "signed_action_dedupe_pk",
+ "table": "signed_action_dedupe",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "user_id"
+ ],
+ "nameExplicit": false,
+ "name": "stuffbox_connections_pk",
+ "table": "stuffbox_connections",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "swarm_nodes_pk",
+ "table": "swarm_nodes",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "swarm_seeds_pk",
+ "table": "swarm_seeds",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "swarm_sync_log_pk",
+ "table": "swarm_sync_log",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "user_swarm_likes_pk",
+ "table": "user_swarm_likes",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "user_swarm_reposts_pk",
+ "table": "user_swarm_reposts",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ "id"
+ ],
+ "nameExplicit": false,
+ "name": "users_pk",
+ "table": "users",
+ "entityType": "pks"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "blocks_user_idx",
+ "entityType": "indexes",
+ "table": "blocks"
+ },
+ {
+ "columns": [
+ {
+ "value": "blocked_user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "blocks_blocked_user_idx",
+ "entityType": "indexes",
+ "table": "blocks"
+ },
+ {
+ "columns": [
+ {
+ "value": "bot_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bot_activity_logs_bot_idx",
+ "entityType": "indexes",
+ "table": "bot_activity_logs"
+ },
+ {
+ "columns": [
+ {
+ "value": "action",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bot_activity_logs_action_idx",
+ "entityType": "indexes",
+ "table": "bot_activity_logs"
+ },
+ {
+ "columns": [
+ {
+ "value": "created_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bot_activity_logs_created_idx",
+ "entityType": "indexes",
+ "table": "bot_activity_logs"
+ },
+ {
+ "columns": [
+ {
+ "value": "source_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bot_content_items_source_idx",
+ "entityType": "indexes",
+ "table": "bot_content_items"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_processed",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bot_content_items_processed_idx",
+ "entityType": "indexes",
+ "table": "bot_content_items"
+ },
+ {
+ "columns": [
+ {
+ "value": "external_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bot_content_items_external_idx",
+ "entityType": "indexes",
+ "table": "bot_content_items"
+ },
+ {
+ "columns": [
+ {
+ "value": "bot_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bot_content_sources_bot_idx",
+ "entityType": "indexes",
+ "table": "bot_content_sources"
+ },
+ {
+ "columns": [
+ {
+ "value": "type",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bot_content_sources_type_idx",
+ "entityType": "indexes",
+ "table": "bot_content_sources"
+ },
+ {
+ "columns": [
+ {
+ "value": "bot_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bot_mentions_bot_idx",
+ "entityType": "indexes",
+ "table": "bot_mentions"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_processed",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bot_mentions_processed_idx",
+ "entityType": "indexes",
+ "table": "bot_mentions"
+ },
+ {
+ "columns": [
+ {
+ "value": "created_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bot_mentions_created_idx",
+ "entityType": "indexes",
+ "table": "bot_mentions"
+ },
+ {
+ "columns": [
+ {
+ "value": "bot_id",
+ "isExpression": false
+ },
+ {
+ "value": "window_start",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bot_rate_limits_bot_window_idx",
+ "entityType": "indexes",
+ "table": "bot_rate_limits"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bots_user_id_idx",
+ "entityType": "indexes",
+ "table": "bots"
+ },
+ {
+ "columns": [
+ {
+ "value": "owner_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bots_owner_id_idx",
+ "entityType": "indexes",
+ "table": "bots"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_active",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "bots_active_idx",
+ "entityType": "indexes",
+ "table": "bots"
+ },
+ {
+ "columns": [
+ {
+ "value": "participant1_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "chat_conversations_participant1_idx",
+ "entityType": "indexes",
+ "table": "chat_conversations"
+ },
+ {
+ "columns": [
+ {
+ "value": "last_message_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "chat_conversations_last_message_idx",
+ "entityType": "indexes",
+ "table": "chat_conversations"
+ },
+ {
+ "columns": [
+ {
+ "value": "participant1_id",
+ "isExpression": false
+ },
+ {
+ "value": "participant2_handle",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "chat_conversations_unique",
+ "entityType": "indexes",
+ "table": "chat_conversations"
+ },
+ {
+ "columns": [
+ {
+ "value": "conversation_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "chat_messages_conversation_idx",
+ "entityType": "indexes",
+ "table": "chat_messages"
+ },
+ {
+ "columns": [
+ {
+ "value": "created_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "chat_messages_created_idx",
+ "entityType": "indexes",
+ "table": "chat_messages"
+ },
+ {
+ "columns": [
+ {
+ "value": "swarm_message_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "chat_messages_swarm_id_idx",
+ "entityType": "indexes",
+ "table": "chat_messages"
+ },
+ {
+ "columns": [
+ {
+ "value": "conversation_id",
+ "isExpression": false
+ },
+ {
+ "value": "client_message_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "chat_messages_conversation_client_id_unique",
+ "entityType": "indexes",
+ "table": "chat_messages"
+ },
+ {
+ "columns": [
+ {
+ "value": "conversation_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "chat_typing_conversation_idx",
+ "entityType": "indexes",
+ "table": "chat_typing_indicators"
+ },
+ {
+ "columns": [
+ {
+ "value": "expires_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "chat_typing_expires_idx",
+ "entityType": "indexes",
+ "table": "chat_typing_indicators"
+ },
+ {
+ "columns": [
+ {
+ "value": "conversation_id",
+ "isExpression": false
+ },
+ {
+ "value": "user_handle",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "chat_typing_unique",
+ "entityType": "indexes",
+ "table": "chat_typing_indicators"
+ },
+ {
+ "columns": [
+ {
+ "value": "did",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "e2ee_key_bundles_did_unique",
+ "entityType": "indexes",
+ "table": "e2ee_key_bundles"
+ },
+ {
+ "columns": [
+ {
+ "value": "key_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "e2ee_key_bundles_key_id_unique",
+ "entityType": "indexes",
+ "table": "e2ee_key_bundles"
+ },
+ {
+ "columns": [
+ {
+ "value": "key_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "e2ee_key_vaults_key_id_unique",
+ "entityType": "indexes",
+ "table": "e2ee_key_vaults"
+ },
+ {
+ "columns": [
+ {
+ "value": "owner_user_id",
+ "isExpression": false
+ },
+ {
+ "value": "sender_did",
+ "isExpression": false
+ },
+ {
+ "value": "message_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "e2ee_message_receipts_owner_sender_message_unique",
+ "entityType": "indexes",
+ "table": "e2ee_message_receipts"
+ },
+ {
+ "columns": [
+ {
+ "value": "received_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "e2ee_message_receipts_received_idx",
+ "entityType": "indexes",
+ "table": "e2ee_message_receipts"
+ },
+ {
+ "columns": [
+ {
+ "value": "key_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "e2ee_remote_key_bundles_key_id_idx",
+ "entityType": "indexes",
+ "table": "e2ee_remote_key_bundles"
+ },
+ {
+ "columns": [
+ {
+ "value": "handle",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "e2ee_remote_key_bundles_handle_idx",
+ "entityType": "indexes",
+ "table": "e2ee_remote_key_bundles"
+ },
+ {
+ "columns": [
+ {
+ "value": "follower_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "follows_follower_idx",
+ "entityType": "indexes",
+ "table": "follows"
+ },
+ {
+ "columns": [
+ {
+ "value": "following_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "follows_following_idx",
+ "entityType": "indexes",
+ "table": "follows"
+ },
+ {
+ "columns": [
+ {
+ "value": "updated_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "handle_registry_updated_idx",
+ "entityType": "indexes",
+ "table": "handle_registry"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ },
+ {
+ "value": "post_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "likes_user_post_idx",
+ "entityType": "indexes",
+ "table": "likes"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "media_user_idx",
+ "entityType": "indexes",
+ "table": "media"
+ },
+ {
+ "columns": [
+ {
+ "value": "post_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "media_post_idx",
+ "entityType": "indexes",
+ "table": "media"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "muted_nodes_user_idx",
+ "entityType": "indexes",
+ "table": "muted_nodes"
+ },
+ {
+ "columns": [
+ {
+ "value": "node_domain",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "muted_nodes_domain_idx",
+ "entityType": "indexes",
+ "table": "muted_nodes"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "mutes_user_idx",
+ "entityType": "indexes",
+ "table": "mutes"
+ },
+ {
+ "columns": [
+ {
+ "value": "muted_user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "mutes_muted_user_idx",
+ "entityType": "indexes",
+ "table": "mutes"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "notifications_user_idx",
+ "entityType": "indexes",
+ "table": "notifications"
+ },
+ {
+ "columns": [
+ {
+ "value": "created_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "notifications_created_idx",
+ "entityType": "indexes",
+ "table": "notifications"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "posts_user_id_idx",
+ "entityType": "indexes",
+ "table": "posts"
+ },
+ {
+ "columns": [
+ {
+ "value": "bot_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "posts_bot_id_idx",
+ "entityType": "indexes",
+ "table": "posts"
+ },
+ {
+ "columns": [
+ {
+ "value": "created_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "posts_created_at_idx",
+ "entityType": "indexes",
+ "table": "posts"
+ },
+ {
+ "columns": [
+ {
+ "value": "reply_to_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "posts_reply_to_idx",
+ "entityType": "indexes",
+ "table": "posts"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_removed",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "posts_removed_idx",
+ "entityType": "indexes",
+ "table": "posts"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_nsfw",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "posts_nsfw_idx",
+ "entityType": "indexes",
+ "table": "posts"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_followers_user_idx",
+ "entityType": "indexes",
+ "table": "remote_followers"
+ },
+ {
+ "columns": [
+ {
+ "value": "actor_url",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_followers_actor_idx",
+ "entityType": "indexes",
+ "table": "remote_followers"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ },
+ {
+ "value": "actor_url",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_followers_user_actor_unique",
+ "entityType": "indexes",
+ "table": "remote_followers"
+ },
+ {
+ "columns": [
+ {
+ "value": "follower_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_follows_follower_idx",
+ "entityType": "indexes",
+ "table": "remote_follows"
+ },
+ {
+ "columns": [
+ {
+ "value": "target_handle",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_follows_target_idx",
+ "entityType": "indexes",
+ "table": "remote_follows"
+ },
+ {
+ "columns": [
+ {
+ "value": "post_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_likes_post_idx",
+ "entityType": "indexes",
+ "table": "remote_likes"
+ },
+ {
+ "columns": [
+ {
+ "value": "actor_handle",
+ "isExpression": false
+ },
+ {
+ "value": "actor_node_domain",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_likes_actor_idx",
+ "entityType": "indexes",
+ "table": "remote_likes"
+ },
+ {
+ "columns": [
+ {
+ "value": "post_id",
+ "isExpression": false
+ },
+ {
+ "value": "actor_handle",
+ "isExpression": false
+ },
+ {
+ "value": "actor_node_domain",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_likes_unique",
+ "entityType": "indexes",
+ "table": "remote_likes"
+ },
+ {
+ "columns": [
+ {
+ "value": "author_handle",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_posts_author_idx",
+ "entityType": "indexes",
+ "table": "remote_posts"
+ },
+ {
+ "columns": [
+ {
+ "value": "published_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_posts_published_idx",
+ "entityType": "indexes",
+ "table": "remote_posts"
+ },
+ {
+ "columns": [
+ {
+ "value": "ap_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_posts_ap_id_idx",
+ "entityType": "indexes",
+ "table": "remote_posts"
+ },
+ {
+ "columns": [
+ {
+ "value": "post_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_reposts_post_idx",
+ "entityType": "indexes",
+ "table": "remote_reposts"
+ },
+ {
+ "columns": [
+ {
+ "value": "actor_handle",
+ "isExpression": false
+ },
+ {
+ "value": "actor_node_domain",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_reposts_actor_idx",
+ "entityType": "indexes",
+ "table": "remote_reposts"
+ },
+ {
+ "columns": [
+ {
+ "value": "post_id",
+ "isExpression": false
+ },
+ {
+ "value": "actor_handle",
+ "isExpression": false
+ },
+ {
+ "value": "actor_node_domain",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "remote_reposts_unique",
+ "entityType": "indexes",
+ "table": "remote_reposts"
+ },
+ {
+ "columns": [
+ {
+ "value": "status",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "reports_status_idx",
+ "entityType": "indexes",
+ "table": "reports"
+ },
+ {
+ "columns": [
+ {
+ "value": "target_type",
+ "isExpression": false
+ },
+ {
+ "value": "target_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "reports_target_idx",
+ "entityType": "indexes",
+ "table": "reports"
+ },
+ {
+ "columns": [
+ {
+ "value": "reporter_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "reports_reporter_idx",
+ "entityType": "indexes",
+ "table": "reports"
+ },
+ {
+ "columns": [
+ {
+ "value": "token",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "sessions_token_idx",
+ "entityType": "indexes",
+ "table": "sessions"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "sessions_user_idx",
+ "entityType": "indexes",
+ "table": "sessions"
+ },
+ {
+ "columns": [
+ {
+ "value": "created_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "signed_action_dedupe_created_idx",
+ "entityType": "indexes",
+ "table": "signed_action_dedupe"
+ },
+ {
+ "columns": [
+ {
+ "value": "domain",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "swarm_nodes_domain_idx",
+ "entityType": "indexes",
+ "table": "swarm_nodes"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_active",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "swarm_nodes_active_idx",
+ "entityType": "indexes",
+ "table": "swarm_nodes"
+ },
+ {
+ "columns": [
+ {
+ "value": "last_seen_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "swarm_nodes_last_seen_idx",
+ "entityType": "indexes",
+ "table": "swarm_nodes"
+ },
+ {
+ "columns": [
+ {
+ "value": "trust_score",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "swarm_nodes_trust_idx",
+ "entityType": "indexes",
+ "table": "swarm_nodes"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_nsfw",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "swarm_nodes_nsfw_idx",
+ "entityType": "indexes",
+ "table": "swarm_nodes"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_blocked",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "swarm_nodes_blocked_idx",
+ "entityType": "indexes",
+ "table": "swarm_nodes"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_enabled",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "swarm_seeds_enabled_idx",
+ "entityType": "indexes",
+ "table": "swarm_seeds"
+ },
+ {
+ "columns": [
+ {
+ "value": "priority",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "swarm_seeds_priority_idx",
+ "entityType": "indexes",
+ "table": "swarm_seeds"
+ },
+ {
+ "columns": [
+ {
+ "value": "remote_domain",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "swarm_sync_log_remote_idx",
+ "entityType": "indexes",
+ "table": "swarm_sync_log"
+ },
+ {
+ "columns": [
+ {
+ "value": "created_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "swarm_sync_log_created_idx",
+ "entityType": "indexes",
+ "table": "swarm_sync_log"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ },
+ {
+ "value": "liked_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "user_swarm_likes_user_idx",
+ "entityType": "indexes",
+ "table": "user_swarm_likes"
+ },
+ {
+ "columns": [
+ {
+ "value": "node_domain",
+ "isExpression": false
+ },
+ {
+ "value": "original_post_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "user_swarm_likes_post_idx",
+ "entityType": "indexes",
+ "table": "user_swarm_likes"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ },
+ {
+ "value": "node_domain",
+ "isExpression": false
+ },
+ {
+ "value": "original_post_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "user_swarm_likes_unique",
+ "entityType": "indexes",
+ "table": "user_swarm_likes"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ },
+ {
+ "value": "reposted_at",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "user_swarm_reposts_user_idx",
+ "entityType": "indexes",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "columns": [
+ {
+ "value": "node_domain",
+ "isExpression": false
+ },
+ {
+ "value": "original_post_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "user_swarm_reposts_post_idx",
+ "entityType": "indexes",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "columns": [
+ {
+ "value": "user_id",
+ "isExpression": false
+ },
+ {
+ "value": "node_domain",
+ "isExpression": false
+ },
+ {
+ "value": "original_post_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "user_swarm_reposts_unique",
+ "entityType": "indexes",
+ "table": "user_swarm_reposts"
+ },
+ {
+ "columns": [
+ {
+ "value": "handle",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "users_handle_idx",
+ "entityType": "indexes",
+ "table": "users"
+ },
+ {
+ "columns": [
+ {
+ "value": "did",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "users_did_idx",
+ "entityType": "indexes",
+ "table": "users"
+ },
+ {
+ "columns": [
+ {
+ "value": "handle",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "users_handle_unique_idx",
+ "entityType": "indexes",
+ "table": "users"
+ },
+ {
+ "columns": [
+ {
+ "value": "did",
+ "isExpression": false
+ }
+ ],
+ "isUnique": true,
+ "where": null,
+ "origin": "manual",
+ "name": "users_did_unique_idx",
+ "entityType": "indexes",
+ "table": "users"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_suspended",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "users_suspended_idx",
+ "entityType": "indexes",
+ "table": "users"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_silenced",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "users_silenced_idx",
+ "entityType": "indexes",
+ "table": "users"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_bot",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "users_is_bot_idx",
+ "entityType": "indexes",
+ "table": "users"
+ },
+ {
+ "columns": [
+ {
+ "value": "bot_owner_id",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "users_bot_owner_idx",
+ "entityType": "indexes",
+ "table": "users"
+ },
+ {
+ "columns": [
+ {
+ "value": "is_nsfw",
+ "isExpression": false
+ }
+ ],
+ "isUnique": false,
+ "where": null,
+ "origin": "manual",
+ "name": "users_nsfw_idx",
+ "entityType": "indexes",
+ "table": "users"
+ },
+ {
+ "columns": [
+ "ap_id"
+ ],
+ "nameExplicit": false,
+ "name": "follows_ap_id_unique",
+ "entityType": "uniques",
+ "table": "follows"
+ },
+ {
+ "columns": [
+ "ap_id"
+ ],
+ "nameExplicit": false,
+ "name": "likes_ap_id_unique",
+ "entityType": "uniques",
+ "table": "likes"
+ },
+ {
+ "columns": [
+ "domain"
+ ],
+ "nameExplicit": false,
+ "name": "nodes_domain_unique",
+ "entityType": "uniques",
+ "table": "nodes"
+ },
+ {
+ "columns": [
+ "ap_id"
+ ],
+ "nameExplicit": false,
+ "name": "posts_ap_id_unique",
+ "entityType": "uniques",
+ "table": "posts"
+ },
+ {
+ "columns": [
+ "domain"
+ ],
+ "nameExplicit": false,
+ "name": "swarm_seeds_domain_unique",
+ "entityType": "uniques",
+ "table": "swarm_seeds"
+ },
+ {
+ "columns": [
+ "email"
+ ],
+ "nameExplicit": false,
+ "name": "users_email_unique",
+ "entityType": "uniques",
+ "table": "users"
+ }
+ ],
+ "renames": []
+}
\ No newline at end of file
diff --git a/src/app/api/swarm/announce/route.ts b/src/app/api/swarm/announce/route.ts
index b3c164d..410b11c 100644
--- a/src/app/api/swarm/announce/route.ts
+++ b/src/app/api/swarm/announce/route.ts
@@ -32,10 +32,11 @@ const announcementSchema = z.object({
softwareVersion: z.string().optional(),
userCount: z.number().optional(),
postCount: z.number().optional(),
+ mediaCount: z.number().optional(),
isNsfw: z.boolean().optional(),
capabilities: z.array(z.enum(['handles', 'gossip', 'relay', 'search', 'interactions', 'e2ee_dm_v1'])).optional(),
timestamp: z.string().optional(),
-});
+}).passthrough();
// Schema including signature for verification
const signedAnnouncementSchema = announcementSchema.extend({
@@ -101,6 +102,7 @@ export async function POST(request: Request) {
softwareVersion: data.softwareVersion,
userCount: data.userCount,
postCount: data.postCount,
+ mediaCount: data.mediaCount,
isNsfw: data.isNsfw,
capabilities: data.capabilities,
lastSeenAt: new Date().toISOString(),
@@ -122,6 +124,7 @@ export async function POST(request: Request) {
softwareVersion: ourAnnouncement.softwareVersion,
userCount: ourAnnouncement.userCount,
postCount: ourAnnouncement.postCount,
+ mediaCount: ourAnnouncement.mediaCount,
isNsfw: ourAnnouncement.isNsfw,
capabilities: ourAnnouncement.capabilities,
lastSeenAt: new Date().toISOString(),
diff --git a/src/app/api/swarm/gossip/route.ts b/src/app/api/swarm/gossip/route.ts
index 9519d15..63cea2b 100644
--- a/src/app/api/swarm/gossip/route.ts
+++ b/src/app/api/swarm/gossip/route.ts
@@ -30,10 +30,11 @@ const nodeInfoSchema = z.object({
softwareVersion: z.string().optional(),
userCount: z.number().optional(),
postCount: z.number().optional(),
+ mediaCount: z.number().optional(),
isNsfw: z.boolean().optional(),
capabilities: z.array(z.enum(['handles', 'gossip', 'relay', 'search', 'interactions', 'e2ee_dm_v1'])).optional(),
lastSeenAt: z.string().optional(),
-});
+}).passthrough();
const gossipPayloadSchema = z.object({
sender: z.string().min(1),
@@ -41,7 +42,7 @@ const gossipPayloadSchema = z.object({
handles: z.array(handleSchema).optional(),
timestamp: z.string(),
since: z.string().optional(),
-});
+}).passthrough();
// Schema including signature for verification
const signedGossipSchema = gossipPayloadSchema.extend({
diff --git a/src/app/api/swarm/info/route.ts b/src/app/api/swarm/info/route.ts
index 8224acd..95aa7ce 100644
--- a/src/app/api/swarm/info/route.ts
+++ b/src/app/api/swarm/info/route.ts
@@ -26,6 +26,7 @@ export async function GET() {
softwareVersion: announcement.softwareVersion,
userCount: announcement.userCount,
postCount: announcement.postCount,
+ mediaCount: announcement.mediaCount,
isNsfw: announcement.isNsfw,
capabilities: announcement.capabilities,
lastSeenAt: new Date().toISOString(),
diff --git a/src/components/RightSidebar.tsx b/src/components/RightSidebar.tsx
index 93e0767..425d893 100644
--- a/src/components/RightSidebar.tsx
+++ b/src/components/RightSidebar.tsx
@@ -22,6 +22,17 @@ interface NodeInfo {
isNsfw: boolean;
}
+interface NetworkStats {
+ totalNodes: number;
+ totalUsers: number;
+ totalMedia: number;
+ totalPosts: number;
+}
+
+function formatNetworkTotal(value: number | undefined): string {
+ return typeof value === 'number' ? value.toLocaleString() : '—';
+}
+
export function RightSidebar() {
const fallbackDescription = process.env.NEXT_PUBLIC_NODE_DESCRIPTION || 'A swarm social network node.';
const [nodeInfo, setNodeInfo] = useState({
@@ -39,6 +50,7 @@ export function RightSidebar() {
commitCount: number | null;
buildDate: string | null;
} | null>(null);
+ const [networkStats, setNetworkStats] = useState(null);
const [loading, setLoading] = useState(true);
@@ -87,7 +99,18 @@ export function RightSidebar() {
.then(data => setVersion(data))
.catch(() => setVersion({ version: 'unknown', commit: null, commitCount: null, buildDate: null }));
- return () => window.removeEventListener('synapsis:node-updated', handleNodeUpdated);
+ const loadNetworkStats = () => fetch('/api/swarm/nodes?stats=true&limit=1', { cache: 'no-store' })
+ .then(res => res.ok ? res.json() : Promise.reject(new Error('Failed to load network stats')))
+ .then(data => setNetworkStats(data?.stats ?? null))
+ .catch(() => setNetworkStats(null));
+
+ void loadNetworkStats();
+ const networkStatsInterval = window.setInterval(loadNetworkStats, 60_000);
+
+ return () => {
+ window.removeEventListener('synapsis:node-updated', handleNodeUpdated);
+ window.clearInterval(networkStatsInterval);
+ };
}, []);
if (loading) {
@@ -165,6 +188,22 @@ export function RightSidebar() {
: ''}
+
+ {[
+ ['Total nodes', networkStats?.totalNodes],
+ ['Total users', networkStats?.totalUsers],
+ ['Total media', networkStats?.totalMedia],
+ ['Total posts', networkStats?.totalPosts],
+ ].map(([label, value]) => (
+
+ {label}
+
+ {formatNetworkTotal(value as number | undefined)}
+
+
+ ))}
+
+
{nodeInfo.admins.length > 0 && (
diff --git a/src/db/schema.ts b/src/db/schema.ts
index da14408..d8efa15 100644
--- a/src/db/schema.ts
+++ b/src/db/schema.ts
@@ -699,6 +699,7 @@ export const swarmNodes = sqliteTable('swarm_nodes', {
// Stats (updated periodically)
userCount: integer('user_count'),
postCount: integer('post_count'),
+ mediaCount: integer('media_count'),
// NSFW flag (synced from remote node)
isNsfw: integer('is_nsfw', { mode: 'boolean' }).default(false).notNull(),
diff --git a/src/lib/swarm/discovery.ts b/src/lib/swarm/discovery.ts
index 51b9184..2f949cf 100644
--- a/src/lib/swarm/discovery.ts
+++ b/src/lib/swarm/discovery.ts
@@ -4,8 +4,8 @@
* Handles node discovery and announcement in the swarm network.
*/
-import { db, users, posts } from '@/db';
-import { sql } from 'drizzle-orm';
+import { db, users, posts, media } from '@/db';
+import { isNotNull, sql } from 'drizzle-orm';
import type { SwarmAnnouncement, SwarmNodeInfo, SwarmCapability } from './types';
import { getCurrentBuildInfo } from '@/lib/version';
import { upsertSwarmNode, getSeedNodes, markNodeSuccess, markNodeFailure } from './registry';
@@ -31,6 +31,7 @@ export async function buildAnnouncement(): Promise {
let publicKey = '';
let userCount = 0;
let postCount = 0;
+ let mediaCount = 0;
let isNsfw = false;
if (db) {
@@ -50,9 +51,13 @@ export async function buildAnnouncement(): Promise {
// Get counts
const userResult = await db.select({ count: sql`count(*)` }).from(users);
const postResult = await db.select({ count: sql`count(*)` }).from(posts);
+ const mediaResult = await db.select({ count: sql`count(*)` })
+ .from(media)
+ .where(isNotNull(media.postId));
userCount = Number(userResult[0]?.count ?? 0);
postCount = Number(postResult[0]?.count ?? 0);
+ mediaCount = Number(mediaResult[0]?.count ?? 0);
}
const capabilities: SwarmCapability[] = ['handles', 'gossip', 'interactions', 'e2ee_dm_v1'];
@@ -68,6 +73,7 @@ export async function buildAnnouncement(): Promise {
: buildInfo.version,
userCount,
postCount,
+ mediaCount,
capabilities,
isNsfw,
timestamp: new Date().toISOString(),
@@ -212,6 +218,7 @@ export async function fetchNodeInfo(domain: string): Promise node.isActive);
+ const localNodeOffset = includeLocalNode ? 1 : 0;
+
+ return {
+ totalNodes: publicNodes.length + localNodeOffset,
+ // Keep this as the active peer count; the scheduler uses zero to trigger seed recovery.
+ activeNodes: activeNodes.length,
+ totalUsers: activeNodes.reduce((sum, node) => sum + (node.userCount || 0), 0)
+ + (includeLocalNode ? local.users : 0),
+ totalPosts: activeNodes.reduce((sum, node) => sum + (node.postCount || 0), 0)
+ + (includeLocalNode ? local.posts : 0),
+ totalMedia: activeNodes.reduce((sum, node) => sum + (node.mediaCount || 0), 0)
+ + (includeLocalNode ? local.media : 0),
+ };
+}
+
/**
* Get or create a swarm node entry
*/
@@ -46,6 +80,7 @@ export async function upsertSwarmNode(
softwareVersion: node.softwareVersion,
userCount: node.userCount,
postCount: node.postCount,
+ mediaCount: node.mediaCount,
isNsfw: node.isNsfw ?? false,
discoveredVia,
capabilities,
@@ -64,6 +99,7 @@ export async function upsertSwarmNode(
softwareVersion: node.softwareVersion ?? existing.softwareVersion,
userCount: node.userCount ?? existing.userCount,
postCount: node.postCount ?? existing.postCount,
+ mediaCount: node.mediaCount ?? existing.mediaCount,
isNsfw: node.isNsfw ?? existing.isNsfw,
capabilities: capabilities ?? existing.capabilities,
lastSeenAt: new Date(),
@@ -317,22 +353,25 @@ export async function getSwarmStats() {
activeNodes: 0,
totalUsers: 0,
totalPosts: 0,
+ totalMedia: 0,
};
}
const allNodes = await db.query.swarmNodes.findMany();
const publicNodes = allNodes.filter(n => isPublicSwarmDomain(n.domain));
- const activeNodes = publicNodes.filter(n => n.isActive);
- const totalUsers = activeNodes.reduce((sum, n) => sum + (n.userCount || 0), 0);
- const totalPosts = activeNodes.reduce((sum, n) => sum + (n.postCount || 0), 0);
+ const [localUsers, localPosts, localMedia] = await Promise.all([
+ db.select({ count: sql`count(*)` }).from(users),
+ db.select({ count: sql`count(*)` }).from(posts),
+ db.select({ count: sql`count(*)` }).from(media).where(isNotNull(media.postId)),
+ ]);
- return {
- totalNodes: publicNodes.length,
- activeNodes: activeNodes.length,
- totalUsers,
- totalPosts,
- };
+ const hasPublicLocalNode = isPublicSwarmDomain(process.env.NEXT_PUBLIC_NODE_DOMAIN);
+ return aggregateSwarmStats(publicNodes, {
+ users: Number(localUsers[0]?.count ?? 0),
+ posts: Number(localPosts[0]?.count ?? 0),
+ media: Number(localMedia[0]?.count ?? 0),
+ }, hasPublicLocalNode);
}
// Helper to convert DB node to SwarmNodeInfo
@@ -346,6 +385,7 @@ function nodeToInfo(node: typeof swarmNodes.$inferSelect): SwarmNodeInfo {
softwareVersion: node.softwareVersion ?? undefined,
userCount: node.userCount ?? undefined,
postCount: node.postCount ?? undefined,
+ mediaCount: node.mediaCount ?? undefined,
capabilities: node.capabilities ? JSON.parse(node.capabilities) : undefined,
isNsfw: node.isNsfw,
lastSeenAt: node.lastSeenAt.toISOString(),
diff --git a/src/lib/swarm/stats.test.ts b/src/lib/swarm/stats.test.ts
new file mode 100644
index 0000000..7ea656c
--- /dev/null
+++ b/src/lib/swarm/stats.test.ts
@@ -0,0 +1,42 @@
+import { describe, expect, it } from 'vitest';
+import { aggregateSwarmStats } from './registry';
+
+describe('aggregateSwarmStats', () => {
+ it('includes the local node and totals active peer statistics', () => {
+ const result = aggregateSwarmStats([
+ { isActive: true, userCount: 3, postCount: 24, mediaCount: 7 },
+ { isActive: true, userCount: 2, postCount: 8, mediaCount: null },
+ { isActive: false, userCount: 50, postCount: 500, mediaCount: 100 },
+ ], {
+ users: 4,
+ posts: 12,
+ media: 5,
+ }, true);
+
+ expect(result).toEqual({
+ totalNodes: 4,
+ activeNodes: 2,
+ totalUsers: 9,
+ totalPosts: 44,
+ totalMedia: 12,
+ });
+ });
+
+ it('excludes local counts when the node is not publicly participating', () => {
+ const result = aggregateSwarmStats([
+ { isActive: true, userCount: 3, postCount: 24, mediaCount: 7 },
+ ], {
+ users: 100,
+ posts: 200,
+ media: 300,
+ }, false);
+
+ expect(result).toEqual({
+ totalNodes: 1,
+ activeNodes: 1,
+ totalUsers: 3,
+ totalPosts: 24,
+ totalMedia: 7,
+ });
+ });
+});
diff --git a/src/lib/swarm/types.ts b/src/lib/swarm/types.ts
index a9f4798..624e38d 100644
--- a/src/lib/swarm/types.ts
+++ b/src/lib/swarm/types.ts
@@ -13,6 +13,7 @@ export interface SwarmNodeInfo {
softwareVersion?: string;
userCount?: number;
postCount?: number;
+ mediaCount?: number;
capabilities?: SwarmCapability[];
isNsfw?: boolean;
lastSeenAt?: string;
@@ -29,6 +30,7 @@ export interface SwarmAnnouncement {
softwareVersion: string;
userCount: number;
postCount: number;
+ mediaCount: number;
capabilities: SwarmCapability[];
isNsfw: boolean;
timestamp: string;
@@ -91,6 +93,7 @@ export interface SwarmStats {
activeNodes: number;
totalUsers: number;
totalPosts: number;
+ totalMedia: number;
lastUpdated: string;
}