DBX深度解析:Rust+Tauri 2打造的20MB全能数据库客户端——60+数据库一键管理、内置AI助手与MCP协议的开源实战指南
前言:数据库管理工具的「不可能三角」
作为后端开发者,我们每天都要和数据库打交道。MySQL查用户表、Redis看缓存、PostgreSQL跑分析、MongoDB管文档、ClickHouse做OLAP……一个项目下来,电脑上装了四五个数据库客户端是常态。DBeaver太重(吃1GB内存)、Navicat太贵、TablePlus只支持macOS、RedisInsight只管Redis——这就是数据库管理工具的「不可能三角」:轻量、全能、跨平台,三者最多占两个。
2026年,一个叫DBX的开源项目打破了这个僵局。20MB安装包,支持60+种数据库,原生支持macOS/Windows/Linux,内置AI SQL助手,还支持MCP协议让AI Agent直接查询你的数据库。它用Rust做后端、Tauri 2做桌面壳、Vue 3做前端——把前端框架的开发体验和Rust的性能优势结合到了极致。
本文将从架构设计、核心特性、代码实战、MCP集成、AI助手、自部署方案六个维度,深度拆解DBX的技术实现,带你看看一个「20MB的数据库客户端」是怎么做到的。
一、为什么需要一个新的数据库客户端?
1.1 现有工具的痛点矩阵
| 工具 | 轻量 | 全能 | 跨平台 | AI集成 | 开源 | 价格 |
|---|---|---|---|---|---|---|
| DBeaver | ❌ (1GB+ JRE) | ✅ | ✅ | ❌ | ✅ (Community) | 免费/付费 |
| Navicat | ✅ | ✅ | ❌ (无Linux) | ❌ | ❌ | $$$$ |
| TablePlus | ✅ | ✅ | ❌ (仅macOS) | ❌ | ❌ | $89 |
| DataGrip | ❌ (JVM) | ✅ | ✅ | 部分 | ❌ | $89/年 |
| Beekeeper Studio | ✅ | ❌ (有限) | ✅ | ❌ | ✅ | 免费/付费 |
| DBX | ✅ (20MB) | ✅ (60+) | ✅ | ✅ | ✅ | 免费 |
DBX的定位很清晰:做一个开源的、轻量的、AI原生的全能数据库客户端。
1.2 技术选型的必然性
为什么是Rust + Tauri 2 + Vue 3?这不是随意组合,而是经过深思熟虑的技术选型:
Rust做后端核心:数据库驱动需要高性能和内存安全。Rust的零成本抽象让DBX在处理大量数据行时不卡顿,同时没有GC停顿。对比DBeaver的Java后端,Rust的内存占用可以低一个数量级。
Tauri 2做桌面壳:Electron打包一个Chromium就200MB起步,而Tauri 2使用系统原生WebView(macOS用WKWebView、Windows用WebView2、Linux用WebKitGTK),安装包直接缩小到20MB。Tauri 2在2025年底正式发布,带来了移动端支持、多窗口改进和更安全的IPC通信。
Vue 3做前端UI:数据库客户端的UI本质上是一个复杂的表格编辑器+树形导航+代码编辑器。Vue 3的Composition API和响应式系统非常适合这种数据密集型的前端场景。
二、架构深度拆解
2.1 整体架构
DBX采用经典的前后端分离架构,但运行在同一个进程内:
┌─────────────────────────────────────────────────┐
│ Tauri 2 壳 │
│ ┌─────────────────────────────────────────────┐ │
│ │ Vue 3 前端 │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ 连接管理 │ │ SQL编辑器 │ │ 数据表格 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ AI助手 │ │ ER图 │ │ 导入导出 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ └─────────────────────────────────────────────┘ │
│ Tauri IPC │
│ ┌─────────────────────────────────────────────┐ │
│ │ Rust 后端核心 │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ 连接池 │ │ 查询引擎 │ │ AI引擎 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ MCP服务 │ │ 数据导出 │ │ 插件系统 │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
2.2 Rust后端核心模块
DBX的Rust后端是整个系统的灵魂。它负责:
数据库驱动抽象层:DBX并没有为每个数据库写一个完整的驱动,而是利用Rust生态中成熟的数据库crate,通过trait抽象统一接口:
// DBX的核心数据库trait(简化示意)
pub trait DatabaseDriver: Send + Sync {
async fn connect(&self, config: &ConnectionConfig) -> Result<Box<dyn Connection>>;
async fn execute(&self, conn: &dyn Connection, sql: &str) -> Result<QueryResult>;
async fn get_schemas(&self, conn: &dyn Connection) -> Result<Vec<Schema>>;
async fn get_tables(&self, conn: &dyn Connection, schema: &str) -> Result<Vec<Table>>;
async fn get_columns(&self, conn: &dyn Connection, table: &str) -> Result<Vec<Column>>;
fn driver_name(&self) -> &str;
fn default_port(&self) -> u16;
}
每个数据库实现这个trait,底层调用对应的crate:
- MySQL →
sqlx::MySqlPool - PostgreSQL →
sqlx::PgPool - SQLite →
rusqlite - Redis →
redis-rs - MongoDB →
mongodb - ClickHouse →
clickhouse-rs
连接池管理:DBX使用Rust的异步运行时(tokio)管理连接池,每个数据库连接配置独立的池大小、超时时间和空闲回收策略。
// 连接池配置示例
pub struct PoolConfig {
pub max_size: u32, // 最大连接数
pub min_idle: u32, // 最小空闲连接
pub max_lifetime: Duration, // 连接最大生命周期
pub idle_timeout: Duration, // 空闲超时
pub connect_timeout: Duration, // 连接超时
}
查询执行引擎:支持同步和异步两种模式,大结果集使用流式读取避免内存溢出:
pub enum QueryMode {
/// 一次性加载所有结果
Eager,
/// 流式读取,每次返回一批行
Stream { batch_size: usize },
}
pub struct QueryResult {
pub columns: Vec<ColumnInfo>,
pub rows: Vec<Vec<Value>>,
pub affected_rows: u64,
pub execution_time: Duration,
pub truncated: bool, // 是否被截断
}
2.3 Tauri 2 IPC通信
Tauri 2的IPC(进程间通信)是连接Vue前端和Rust后端的桥梁。DBX通过Tauri的invoke机制暴露命令:
// Rust端:暴露给前端的命令
#[tauri::command]
async fn execute_query(
state: State<'_, AppState>,
connection_id: String,
sql: String,
mode: Option<String>,
) -> Result<QueryResult, String> {
let conn = state.get_connection(&connection_id).await
.map_err(|e| e.to_string())?;
let result = conn.execute(&sql).await
.map_err(|e| e.to_string())?;
Ok(result)
}
#[tauri::command]
async fn get_databases(
state: State<'_, AppState>,
connection_id: String,
) -> Result<Vec<Database>, String> {
let conn = state.get_connection(&connection_id).await
.map_err(|e| e.to_string())?;
conn.list_databases().await.map_err(|e| e.to_string())
}
// Vue前端:调用Rust命令
import { invoke } from '@tauri-apps/api/core';
const result = await invoke<QueryResult>('execute_query', {
connectionId: 'my-postgres',
sql: 'SELECT * FROM users LIMIT 100',
mode: 'eager',
});
Tauri 2相比Tauri 1的关键改进:
- 权限系统重构:每个命令需要显式声明权限,安全性更高
- 事件系统增强:支持前端到后端的双向事件流,适合实时查询进度推送
- 多窗口支持:可以同时打开多个数据库连接窗口
2.4 Vue 3前端架构
DBX的前端采用Vue 3 + TypeScript + Vite构建,核心组件包括:
SQL编辑器:基于Monaco Editor(VS Code同款编辑器引擎),支持SQL语法高亮、自动补全、错误提示。DBX会根据当前连接的数据库类型加载对应的SQL方言补全规则。
数据表格:虚拟滚动的高性能表格组件,支持百万级数据行的流畅展示。列宽自适应、排序、过滤、复制、导出——这些功能在大数据量下都需要精心优化。
树形导航:数据库 → Schema → 表 → 列的层级结构,懒加载避免一次性拉取所有元数据。
ER图:基于表之间的外键关系自动生成实体关系图,使用Canvas或SVG渲染。
三、60+数据库支持的技术实现
3.1 支持矩阵
DBX支持的数据库种类令人印象深刻,覆盖了几乎所有主流和国产数据库:
关系型数据库:MySQL、PostgreSQL、SQLite、MariaDB、SQL Server、Oracle、TiDB、OceanBase、达梦DM8、openGauss、GaussDB、KWDB、KingBase、Vastbase、GoldenDB、SelectDB、Doris、StarRocks
NoSQL数据库:MongoDB、Redis、Elasticsearch、CouchDB
向量数据库:Qdrant、Milvus、Weaviate
OLAP数据库:ClickHouse、DuckDB、Apache Druid
时序数据库:InfluxDB、TDengine、CockroachDB
图数据库:Neo4j、NebulaGraph
消息队列:Kafka(通过SQL接口)
其他:etcd、FTP/SFTP、BigQuery、Databricks、Databend、Redshift、Firebird
3.2 驱动插件化
DBX的数据库驱动采用插件化架构。每个数据库驱动是一个独立的Rust crate,编译为动态库或静态链接。这种设计有几个好处:
- 按需编译:Docker版本可以只编译常用数据库,减小镜像体积
- 独立更新:某个数据库驱动的bug修复不需要重新发布整个应用
- 社区贡献:第三方开发者可以开发新的数据库驱动插件
# Cargo.toml中的数据库feature flags
[features]
default = ["mysql", "postgres", "sqlite", "redis", "mongodb"]
mysql = ["dep:sqlx-mysql"]
postgres = ["dep:sqlx-postgres"]
sqlite = ["dep:rusqlite"]
redis = ["dep:redis"]
mongodb = ["dep:mongodb"]
clickhouse = ["dep:clickhouse-rs"]
duckdb = ["dep:duckdb"]
# ... 更多数据库
3.3 跨数据库SQL方言处理
不同数据库的SQL方言差异巨大。DBX在Rust后端维护了一个SQL方言适配层:
pub enum SqlDialect {
MySQL,
PostgreSQL,
SQLite,
SqlServer,
Oracle,
ClickHouse,
// ...
}
impl SqlDialect {
pub fn quote_identifier(&self, name: &str) -> String {
match self {
Self::MySQL => format!("`{}`", name),
Self::PostgreSQL => format!("\"{}\"", name),
Self::SqlServer => format!("[{}]", name),
Self::Oracle => format!("\"{}\"", name.to_uppercase()),
// ...
}
}
pub fn limit_clause(&self, limit: u64, offset: u64) -> String {
match self {
Self::MySQL | Self::PostgreSQL | Self::SQLite => {
format!("LIMIT {} OFFSET {}", limit, offset)
}
Self::SqlServer => {
format!("OFFSET {} ROWS FETCH NEXT {} ROWS ONLY", offset, limit)
}
Self::Oracle => {
format!("OFFSET {} ROWS FETCH NEXT {} ROWS ONLY", offset, limit)
}
// ...
}
}
}
四、AI SQL助手:内置的智能查询生成器
4.1 核心功能
DBX内置的AI助手是它区别于传统数据库客户端的最大亮点。选中一张表,用自然语言描述你想要的数据,AI直接生成SQL:
-- 用户输入:查询最近7天每天的新增用户数,按天排序
-- AI生成:
SELECT
DATE(created_at) AS date,
COUNT(*) AS new_users
FROM users
WHERE created_at >= NOW() - INTERVAL 7 DAY
GROUP BY DATE(created_at)
ORDER BY date ASC;
4.2 多模型支持
DBX的AI助手支持多种LLM提供商:
pub enum AIProvider {
OpenAI {
api_key: String,
model: String, // gpt-4o, gpt-4o-mini
base_url: Option<String>,
},
Claude {
api_key: String,
model: String, // claude-sonnet-4-20250514
},
Ollama {
base_url: String, // http://localhost:11434
model: String, // qwen2.5-coder, deepseek-coder
},
Custom {
base_url: String,
api_key: String,
model: String,
},
}
本地模型优先:对于注重数据安全的团队,DBX支持通过Ollama运行本地模型。你的SQL和表结构永远不会离开本地网络。
4.3 安全检查机制
AI生成的SQL在执行前会经过安全检查:
pub fn safety_check(sql: &str, dialect: &SqlDialect) -> SafetyReport {
let mut warnings = Vec::new();
let upper = sql.to_uppercase();
// 检查是否有危险操作
if upper.contains("DROP ") || upper.contains("TRUNCATE ") {
warnings.push(SafetyWarning::DestructiveOperation);
}
if upper.contains("DELETE ") && !upper.contains("WHERE") {
warnings.push(SafetyWarning::DeleteWithoutWhere);
}
if upper.contains("UPDATE ") && !upper.contains("WHERE") {
warnings.push(SafetyWarning::UpdateWithoutWhere);
}
// 检查是否缺少LIMIT
if upper.starts_with("SELECT") && !upper.contains("LIMIT") {
warnings.push(SafetyWarning::SelectWithoutLimit);
}
SafetyReport { warnings, safe: warnings.is_empty() }
}
五、MCP协议:让AI Agent直接查询你的数据库
5.1 什么是MCP?
MCP(Model Context Protocol)是Anthropic在2024年底推出的开放协议,定义了AI模型与外部工具之间的标准通信方式。简单来说,MCP让Claude Code、Cursor、Windsurf等AI编程工具能够直接调用外部服务。
DBX实现了MCP Server,意味着你配置好的数据库连接可以被任何支持MCP的AI工具直接访问。
5.2 DBX的MCP实现
DBX通过Tauri的后台服务暴露MCP端点:
// MCP Server核心实现
pub struct DbxMcpServer {
connections: Arc<RwLock<HashMap<String, Box<dyn DatabaseDriver>>>>,
server: McpServer,
}
impl DbxMcpServer {
pub async fn start(&self, port: u16) -> Result<()> {
// 注册MCP工具
self.server.register_tool("list_connections", list_connections_handler);
self.server.register_tool("execute_query", execute_query_handler);
self.server.register_tool("get_schema", get_schema_handler);
self.server.register_tool("get_table_info", get_table_info_handler);
self.server.register_tool("export_query_result", export_handler);
self.server.listen(port).await
}
}
// MCP工具处理函数
async fn execute_query_handler(params: Value) -> Result<Value> {
let conn_id = params["connection_id"].as_str()
.ok_or("Missing connection_id")?;
let sql = params["sql"].as_str()
.ok_or("Missing sql")?;
// 安全检查
let report = safety_check(sql, &dialect);
if !report.safe {
return Ok(json!({
"error": "Safety check failed",
"warnings": report.warnings
}));
}
let result = execute_on_connection(conn_id, sql).await?;
Ok(json!(result))
}
5.3 在Claude Code中使用DBX的MCP
配置文件(.mcp.json):
{
"mcpServers": {
"dbx": {
"command": "dbx",
"args": ["mcp", "serve", "--port", "3001"],
"env": {}
}
}
}
配置完成后,Claude Code可以直接这样使用:
> 帮我查一下users表里最近注册的10个用户
[Claude Code调用 MCP tool: execute_query]
SELECT * FROM users ORDER BY created_at DESC LIMIT 10;
> 统计每个城市的用户数量,找出TOP 5
[Claude Code调用 MCP tool: execute_query]
SELECT city, COUNT(*) as user_count
FROM users
GROUP BY city
ORDER BY user_count DESC
LIMIT 5;
这比手动打开客户端、复制粘贴SQL要高效得多。
六、Docker自部署:团队共享数据库连接
6.1 Docker Compose一键部署
DBX支持Docker自部署,团队成员共享数据库连接配置:
# docker-compose.yml
version: '3.8'
services:
dbx:
image: dbxio/dbx:latest
ports:
- "3000:3000" # Web界面
- "3001:3001" # MCP端点
volumes:
- dbx-data:/data
environment:
- DBX_DATA_DIR=/data
- DBX_ADMIN_PASSWORD=your-secure-password
- DBX_MCP_ENABLED=true
restart: unless-stopped
volumes:
dbx-data:
启动后访问 http://your-server:3000 即可使用Web版DBX。
6.2 数据安全考量
自部署模式下,所有数据都在你自己的服务器上:
- 连接信息加密存储:数据库密码使用AES-256-GCM加密
- 访问控制:支持Basic Auth和JWT认证
- 审计日志:所有查询操作都有日志记录
- 网络隔离:可以配置只允许内网访问
// 连接信息加密
pub fn encrypt_connection_config(config: &ConnectionConfig, key: &[u8]) -> Result<Vec<u8>> {
let plaintext = serde_json::to_vec(config)?;
let nonce = generate_nonce();
let cipher = Aes256Gcm::new(GenericArray::from_slice(key));
let ciphertext = cipher.encrypt(&nonce, plaintext.as_ref())
.map_err(|_| anyhow!("Encryption failed"))?;
// 返回 nonce + ciphertext
let mut result = nonce.to_vec();
result.extend_from_slice(&ciphertext);
Ok(result)
}
七、与竞品的深度对比
7.1 DBX vs DBeaver
DBeaver是老牌开源数据库客户端,基于Java/Eclipse RCP。它的优势是功能全面、社区成熟,但劣势也很明显:
| 维度 | DBX | DBeaver |
|---|---|---|
| 安装包大小 | 20MB | 500MB+(含JRE) |
| 内存占用 | 50-100MB | 500MB-1.5GB |
| 启动速度 | <1秒 | 5-15秒 |
| AI集成 | 内置 | 无 |
| MCP支持 | 原生 | 无 |
| ER图 | 内置 | Community版无 |
| 数据库数量 | 60+ | 100+(含付费驱动) |
7.2 DBX vs TablePlus
TablePlus是macOS上最受欢迎的数据库客户端之一,以其精致的UI著称。但它的局限性在于:
- 仅支持macOS(Windows版功能受限,无Linux版)
- 不支持国产数据库(达梦、OceanBase等)
- 无AI集成
- 闭源收费
DBX在跨平台和数据库覆盖面上完胜,TablePlus在macOS原生体验上仍有优势。
7.3 DBX vs Beekeeper Studio
Beekeeper Studio是另一个优秀的开源选项,基于Electron构建。对比:
| 维度 | DBX | Beekeeper Studio |
|---|---|---|
| 技术栈 | Rust+Tauri 2 | Electron |
| 安装包大小 | 20MB | 150MB+ |
| 数据库数量 | 60+ | 15-20 |
| AI集成 | 内置 | 无 |
| MCP支持 | 原生 | 无 |
| 国产数据库支持 | 全面 | 无 |
八、实际使用场景与代码实战
8.1 场景一:跨数据库数据迁移
从MySQL迁移数据到PostgreSQL:
-- 1. 在DBX中连接MySQL,导出表结构
SHOW CREATE TABLE users;
-- 2. 在DBX中连接PostgreSQL,创建对应表
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 3. 使用DBX的导入功能,从MySQL导出CSV,导入PostgreSQL
DBX内置的导入导出功能支持CSV、JSON、SQL、Excel多种格式,不需要额外工具。
8.2 场景二:AI辅助复杂查询
假设你有一个电商数据库,需要分析用户购买行为:
-- 自然语言:找出过去30天内购买了3次以上、且平均订单金额超过500元的用户,
-- 按总消费金额降序排列
-- AI生成的SQL:
SELECT
u.id,
u.username,
u.email,
COUNT(o.id) AS order_count,
AVG(o.total_amount) AS avg_order_amount,
SUM(o.total_amount) AS total_spent
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.created_at >= NOW() - INTERVAL 30 DAY
AND o.status = 'completed'
GROUP BY u.id, u.username, u.email
HAVING COUNT(o.id) >= 3 AND AVG(o.total_amount) > 500
ORDER BY total_spent DESC;
8.3 场景三:MCP驱动的自动化运维
通过Claude Code + DBX MCP实现数据库健康检查:
# 在Claude Code中
> 检查PostgreSQL数据库的连接数、慢查询和表膨胀情况
# Claude Code自动调用DBX MCP执行:
SELECT count(*) as active_connections
FROM pg_stat_activity
WHERE state = 'active';
SELECT query, calls, mean_exec_time, total_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;
SELECT schemaname, relname, n_dead_tup, n_live_tup,
round(n_dead_tup::numeric / GREATEST(n_live_tup, 1) * 100, 2) AS dead_ratio
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY dead_ratio DESC;
九、性能优化与最佳实践
9.1 大数据量查询优化
处理百万级数据时,DBX的流式读取模式至关重要:
// 使用流式模式查询大表
const stream = await invoke<QueryStream>('start_stream_query', {
connectionId: 'my-db',
sql: 'SELECT * FROM large_table',
batchSize: 1000,
});
// 逐批处理数据
for await (const batch of stream) {
processBatch(batch.rows);
updateProgress(batch.offset);
}
9.2 连接池调优
根据使用场景调整连接池参数:
{
"connectionPool": {
"maxSize": 10,
"minIdle": 2,
"maxLifetime": "30m",
"idleTimeout": "10m",
"connectTimeout": "5s"
}
}
- 开发环境:
maxSize: 3-5,避免占用太多数据库连接 - 生产Docker部署:
maxSize: 20-50,根据团队规模调整 - 只读查询场景:可以适当增大
maxSize
9.3 内存管理
Rust的优势在内存管理上体现得淋漓尽致。DBX处理大结果集时的内存策略:
- 行数限制:默认最多返回10000行,超出部分需要显式确认
- 列宽截断:单个单元格超过1MB时自动截断
- 懒加载:树形导航中的表列表按需加载
- 缓存过期:元数据缓存5分钟过期,自动刷新
十、生态系统与社区
10.1 插件系统
DBX支持通过插件扩展功能:
# 插件清单示例
[plugin]
name = "dbx-data-compare"
version = "0.1.0"
description = "Compare data between two databases"
author = "community"
[plugin.dependencies]
min_dbx_version = "0.4.0"
10.2 社区贡献
DBX的开源社区活跃度很高:
- GitHub Stars:持续增长中
- Discord社区:活跃的技术讨论
- QQ群:中文社区支持
- Contributing指南:清晰的贡献流程
10.3 许可证
DBX采用Apache 2.0 + MIT双许可证,个人和商业使用均免费,无功能阉割。
十一、未来展望
DBX的Roadmap上有几个值得关注的方向:
- 移动端支持:Tauri 2已经支持iOS和Android,DBX有望成为第一个支持移动端的全能数据库客户端
- 协作功能:多人同时查看同一个数据库连接,类似Google Docs的协作体验
- 数据建模:可视化ER图编辑,直接生成DDL
- AI增强:更智能的查询优化建议、索引推荐、慢查询诊断
- 插件市场:社区插件的集中发布和管理
总结
DBX的出现代表了数据库客户端工具的一个新方向:轻量、AI原生、MCP就绪。它用Rust+Tauri 2证明了20MB的安装包完全可以做到传统工具需要500MB才能实现的功能,而且体验更好。
对于开发者来说,DBX的价值在于:
- 减少工具切换:一个客户端搞定所有数据库,不再需要装四五个工具
- AI提效:自然语言转SQL,复杂查询不再需要手写
- MCP赋能:让AI编程工具直接访问你的数据库,实现真正的AI辅助开发
- 团队协作:Docker自部署,共享连接配置,统一管理
- 开源免费:Apache 2.0许可证,无任何使用限制
如果你还在用DBeaver忍受漫长的启动时间,或者在为Navicat的高昂费用犹豫,不妨试试DBX。20MB,下载即用,可能就是你一直在等的那个数据库客户端。
项目地址:https://github.com/t8y2/dbx
官方文档:https://dbxio.com
下载地址:https://github.com/t8y2/dbx/releases