This commit is contained in:
2026-04-25 16:36:34 +08:00
commit db90e7579b
1876 changed files with 189777 additions and 0 deletions

View File

@@ -0,0 +1,161 @@
---
title: Tailchat —— 插件化的开源聊天平台
description: Tailchat 是一款易拓展、方便使用,并且完全免费开源的聊天平台
authors: moonrailgun
slug: intro
image: /img/logo.svg
keywords:
- tailchat
- 介绍
- 开源
- 开源聊天工具
tags: [介绍]
---
## 前言 First of all
大家好,我是[moonrailgun](https://github.com/moonrailgun),今天为大家介绍的是我个人开发的开源插件式聊天软件: [Tailchat](https://github.com/msgbyte/tailchat)
Tailchat 是一款易拓展、方便使用,并且完全免费开源的聊天平台。在部分思想上借鉴了 [Discord](https://discord.com/) 并在此致敬!
## 动机 Motivation
曾经痴迷于 TRPG, 并花了4年的业余时间做了人生第一款聊天软件 [TRPG Engine](https://github.com/TRPGEngine/Client)。但是受限于题材方面的问题,使用的人虽然一直有,但是并没有太多。
而且因为开发之初受到经验的限制,虽然当初经过了很多次重构,但是仍然背负上了很多的技术债务。而且因为当初没有做好分布式架构的设计,因此在面对实际的单机业务性能瓶颈时也没有非常好的解决方案,导致在高峰期只能让用户处于相对慢的系统响应中。
因此我将在 [TRPG Engine](https://github.com/TRPGEngine/Client) 的开发中遇到的问题收集起来,并重新整理了我的业务需求,开发出了新的继承者 [Tailchat](https://github.com/msgbyte/tailchat)。
因为最开始首先于小众的业务, [Tailchat](https://github.com/msgbyte/tailchat) 的设计之初就做好了易于拓展的准备。定位是除了核心的聊天场景以外,其他的业务需要都是由插件提供的。甚至是聊天的富文本渲染方式、消息的通知也是由插件提供的。作为使用者/开发者,能够方便得为 [Tailchat](https://github.com/msgbyte/tailchat) 拓展新的能力,或者将已有的能力集成到 [Tailchat](https://github.com/msgbyte/tailchat) 中
[Tailchat](https://github.com/msgbyte/tailchat) 名字来源于其logo是两只猫尾巴纠缠在一起的形象表示猫与猫之间最直接的沟通方式。
## 功能 Feature
### 登录页
![](/img/blog/intro/1.png)
登录页除了支持正常的 **登录**、**注册**,为降低使用门槛还允许先进行 **游客访问**,无需注册直接使用。同时还支持 **忘记密码** 功能。向通过用户发送邮件来帮助用户重置密码
> **NOTICE**: 忘记密码功能需要管理员配置SMTP服务
此处以访客为例,创建一个名为 `猫之使徒` 的访客:
![](/img/blog/intro/2.png)
进入主页面后如下显示:
![](/img/blog/intro/3.png)
可以通过点击最上面的认领账号来补充用户信息以方便下次登录
### 添加好友
切换到 `添加好友` 标签页可以看到系统为您生成的4位唯一标识:
![](/img/blog/intro/4.png)
在本例中的唯一标识是`猫之使徒#1216`,您可以通过将这段字符串发送给好友来添加好友。
![](/img/blog/intro/5.png)
### 插件中心
[Tailchat](https://github.com/msgbyte/tailchat) 设计之初就提供了强大的插件系统,通过插件系统能极大拓展[Tailchat](https://github.com/msgbyte/tailchat)自身的能力。
![](/img/blog/intro/6.png)
> NOTICE: 插件本身设计是运行在 可信执行环境(TEE) 中, 请不要随意通过手动安装的方式安装不明来源的第三方插件
### 个人设置
![](/img/blog/intro/7.png)
用户可以在左下方的"···"中打开个人设置。可以自定义头像,修改名称,修改密码等操作。
![](/img/blog/intro/8.png)
通过剪裁工具可以很方便的选出自己想要的部分
![](/img/blog/intro/9.png)
### 系统设置
在系统设置中可以修改界面语言和界面主题。
主题除了 [Tailchat](https://github.com/msgbyte/tailchat) 自带的`暗色主题``亮色主题`以及根据当前系统设置自动切换的`自动`以外均为插件提供
![](/img/blog/intro/10.png)
> 目前 Tailchat 支持的语言仅为 `简体中文` 和 `英语`。欢迎有能力的开发者帮助 Tailchat 进行国际化翻译的工作
### 群组聊天
![](/img/blog/intro/11.png)
点击左上角导航栏的绿色加号即可创建群组
![](/img/blog/intro/12.png)
预设了两个布局模板,直接选择`默认群组`
![](/img/blog/intro/13.png)
随意取个名字,点击创建。系统则会创建一个群组并自动跳转到该群组
界面布局如下:
![](/img/blog/intro/14.png)
![](/img/blog/intro/15.png)
输入框支持 `@` 群组成员:
![](/img/blog/intro/16.png)
### 群组设置
点击左上角的标题栏可以点开群组详情页
![](/img/blog/intro/17.png)
点击查看详情可以进入到群组的详情页
![](/img/blog/intro/18.png)
在此处可以:
- 修改群组头像
- 修改群组名称
- 管理群组面板
#### 面板管理
![](/img/blog/intro/19.png)
创建面板可以直接创建一个面板,内置的面板类型有:
- 聊天频道
- 面板分组
- 网页面板
网页面板可以直接输入一个网址,可以将自己喜好的网址直接集成到 Tailchat 的群组侧边栏
![](/img/blog/intro/20.png)
比如我们插入一个访问 Bilibili 的网页面板,则效果如下:
![](/img/blog/intro/21.png)
![](/img/blog/intro/22.png)
> NOTICE: 因为浏览器的安全策略问题,如果当前 Tailchat 使用了https协议那么只能支持嵌入 https 协议的网页
> NOTICE: 因为浏览器的安全策略问题嵌入的网址需要允许被使用iframe嵌入
## 相关连接
开源地址:
- [https://github.com/msgbyte/tailchat](https://github.com/msgbyte/tailchat)
- [https://github.com/msgbyte/tailchat-server](https://github.com/msgbyte/tailchat-server)

View File

@@ -0,0 +1,96 @@
---
title: Tailchat v1.0.0 已发布,欢迎使用
description: Tailchat 是一款易拓展、方便使用,并且完全免费开源的聊天平台
authors: moonrailgun
slug: release-1.0.0
image: /img/logo.svg
keywords:
- tailchat
- 开源
- 开源聊天工具
tags: [Release Note]
---
`Tailchat` 是一款开源的,面向私域用户打造的即时通讯应用。在经历超过一年的开发之后,她终于迎来了第一个 `v1.0.0` 版本。
官方文档: [https://tailchat.msgbyte.com/](https://tailchat.msgbyte.com/)
## 功能介绍
- 用户系统
- 插件系统
- 群组系统
- 邀请系统
- 身份组系统
- 面板系统
- ...
以下我会重点介绍一下 `Tailchat` 的几个核心系统与设计目的:
### 插件系统
首先是`Tailchat`相比市场上其他竞品独有的插件系统,通过前端的微内核框架[MiniStar](https://ministar.moonrailgun.com/)与后端的分布式框架[Moleculer](https://moleculer.services/), 来实现整个的插件系统。
开发者可以创建自己的插件来接入自己的业务,实现统一化插件,到 v1.0.0 版本为止 Tailchat已经开发了 **14** 个为了不同目的的插件, 实现了: `自定义主题`, `集成第三方系统`, `增强现有能力`, `娱乐` 等需求。因为插件的可拓展性未来还会源源不断开发更多的插件来满足各种各样的需求。
正如 `vscode` / `chrome` 一样, 本身有足够的能力,而插件让其更加优秀。
### 面板系统
面板系统是`Tailchat`设计的特色之一。首先脱离了大多数国内同类产品 `私信`/`群组` 的基本结构。变成了更加通用的 `私信`/`群组`/`面板` 结构,多出了一层维度用以增加群组这一层面的表现力。
`Tailchat` 是为私域场景而设计的(如企业主、Up主、明星等),因此在同一群组的人员是不应设置上限的。而更多人带来的另一个问题是同一群组下无法进行不同的话题的分流。国外的优秀同类产品`Discord` 是使用 "频道" 这一概念来解决这个问题,而 `Tailchat` 将其更加抽象化, 以"面板" 这个概念来承载不同维度的信息,而不仅仅局限于信息流,而可以是更加多的东西。比如连接不同的系统(网页),通过插件来进行交互,接入其他的能力(比如视频会议)。
"面板"的概念带来无限的可能性。这种开放性也是 `Tailchat` 所追求的东西。`Tailchat` 不希望做一个大而全的产品,而是期望做一个拥有无限可能性的产品
### 身份组系统
身份组系统的引入为 `Tailchat` 带来了更加灵活的权限管理机制。通过不同身份组的排列组合可以组合出无数可能的场景。而部分服务端插件也需要身份组权限来管理不同功能对不同用户的开放程度。
目前 `Tailchat` 已经开发了 9 个权限点,而未来可能会有更多。
## 使用场景
一个不自嗨的产品是为了解决一些问题而诞生的,我们也为 `Tailchat` 的未来用户画像做了一些可能的用户场景(讲故事环节):
### 我是一个团队leader
- 每天早上我可以通过 Tailchat 的收件箱 查看@我的,比较重要的消息。我可以一条条处理,即时通讯太让我窒息,而邮件过于过时。
- 点击收件箱中的某一条消息我可以定位到相关的上下文,看看大家是怎么说的
- 通过回复功能我可以在某条消息下面进行一些评论,因为回复的引用功能,大家可以知道我是在对哪一条消息进行回复
- 这时我的回复受到了一个点赞的reaction, 这时一个表情。因为很轻,我不会收到任何打扰,我也不需要去特意处理这条信息。但是我知道这是对我回复的一种肯定与赞同
- 回复完毕所有的消息我需要开启一天的工作。此时我通过群组的面板功能快速点开我常用的工作页面一个OA网页。我的工作中充满了太多的第三方系统。而Tailchat的面板系统能够很好的将我的团队与相关的内容连接起来。
- 这时我发现左侧的面板列表出现了一个红点,这时有新的消息出来了。但是我不想离开我现在的工作,因此我右键它,将它"PIN"在我的右侧 —— 我可以同时处理我的工作与查看消息回复
- 此时面板列表中又出现了一个红点,因为这个面板叫【面试招聘】, 这是一家专门做人事的公司在 Tailchat 做的插件(还没有),他告知我有新的候选人投递了简历。
- 我点击这条信息上的按钮按钮自动变成已同意。同时机器人在下面回复了这条信息xxx通过初审已向该候选人发送面试邀请。
- 等到面试时候,机器人自动为我创建了一个独立的面板。点开面板,上面会显示该候选人的个人简历,同时会有视频会议的界面以及实时协作的空间(比如画图、演示代码)
- 等到一切都结束了,我发现差不多该到下班时间了。我关闭了 Tailchat 页面。此时我发现我的浏览器并没有开很多新的标签页。因为我的工作基本都在Tailchat中完成了
### 我是一个Up主
- 我是一个百万粉丝的某站Up主我有很多粉丝需要管理。为此我开了十几个微信群和好几个qq群。我发现有很多人加了很多群但是我没有办法因为微信和QQ并不提供跨群组管理。而我之所以开这么多群是因为每个群都有人数的上限。因此我找到的Tailchat, Tailchat的群组没有设定人数的上限因为Tailchat天生就是为了这个场合存在的
- 我更新了一条视频我期望大家都能看到。在过去我需要切换到每个群都发一次而在Tailchat我只需要在只允许发言部分角色的公告频道(正在开发)发送一条消息就能立马推给所有的人。甚至我可以使用Tailchat的RSS机器人自动订阅更新并发布。
- 我希望大家能够关注我的不同平台的账号比如bilibili、抖音、微博、小红书、知乎、爱发电、onlyfans等。在过去我需要像织一张网一样在各个平台的个人信息中写上不同平台的链接而在Tailchat, 我可以直接把我在不同平台的个人首页以面板的形式直接展示给我的粉丝。我的粉丝不仅可以直接关注,还可以直接在面板中浏览我的作品。
- 我想要为我的各个平台的账号进行每日的统计,在过去我需要找一个第三方平台(我不知道有没有)或者开源代码自己部署一个定时爬虫。成本很高普通人玩不来。但是在Tailchat的插件市场中我发现了有好心人做的统计的插件(现在还没有),只需要简单的配置他就会每天给我生成定时的日报。
- 我想要开一场直播提前发公告我怕到时候我的粉丝忘记到那时候我还需要重新发送一边以提醒。于是我可以直接在Tailchat的日历插件(现在还没有)上创建一条日程同时我的粉丝们也可以根据日程查看到不同Up主的直播日程更好的管理。
## Roadmap
以下是正在做的和未来准备要做的:
- 视频会议
- 多人协同创作
- 开放平台
- 机器人
- 交互式卡片
- OAuth
- 深度集成已有工作流
- Github
- Email
- 桌面端/移动端
## 开源且开放
`Tailchat` 是一个开源且开放的应用,我们立志将其打造成一套连接各个业务的生态平台。同时我们欢迎来自不同水平、不同能力的开发者为此做出贡献。
仓库地址: [https://github.com/msgbyte/tailchat](https://github.com/msgbyte/tailchat)

View File

@@ -0,0 +1,40 @@
---
title: Tailchat v1.4.0 已发布,欢迎试用
description: 经过几个月的努力Tailchat 终于迎来了他的 `1.4.0` 版本。
authors: moonrailgun
slug: release-1.4.0
image: /img/logo.svg
keywords:
- tailchat
- 开源
- 开源聊天工具
tags: [Release Note]
---
经过几个月的努力,`Tailchat` 终于迎来了他的 `1.4.0` 版本。
在本次重大更新中,`Tailchat` 弥补了在音视频通话上的重大缺失,引入了第三方声网的集成,允许通过插件的形式赋予群组音视频通话的能力。
同时,声网作为老牌的音视频服务商,其稳定的基础建设与服务质量,以及每月免费的额度,对于大部分独立部署的个人用户来说已经是完全足够的了,不论是与朋友交流,还是一起游戏,`Tailchat` 与声网的组合都会是你最好的选择。
![](./images/v1.4.0-agora.png)
关于想要自行部署声网插件的同学,可以查看这篇文档: [声网插件部署指南](/docs/meeting/agora)
当然,对于想要完全独立部署的用户来说,可完全部署的音视频解决方案`tailchat-meeting`正在开发中,请务必期待一下。
---
除此之外Tailchat 在 `1.4.0` 版本还修复了一堆bug并增加了优化用户体验的一些小功能:
- 增加webview的缓存极大优化在切换webview时加载问题
- 增加群组配置权限,增加群组成员隐私控制选项
- 群组用户名隐藏唯一标识位
- 增加成员管理踢出用户功能
- 聊天记录滚动到底部
- 优化`service-worker`的缓存策略,加快`Tailchat`访问速度
- 修复低版本mac/android的兼容问题
- 优化了功能引导,并增加了国际化翻译
- 增加安装应用按钮
- 增加wormhole插件用于文件传输
- markdown渲染的图片允许被放大预览

View File

@@ -0,0 +1,31 @@
---
title: 是时候正式步入noIM的时代了
authors: moonrailgun
image: /img/logo.svg
keywords:
- tailchat
tags: [blog]
---
从远至今已经经历了很多轮沟通方式的变更从邮件到IRC再到如今的如 Slack 或者 Discord 这样的包含了音视频通讯的沟通工具,以及如 Telegram, Signal 这样侧重消息隐私安全的聊天工具。如今我认为现在是时候步入新一代的noIM(Not only IM) 的阶段。
随着人们的对于信息沟通的方式的需求不断的演进我们需要在越来越多的平台上进行协作。我们可以在Slack上进行信息的交流在Figma上沟通设计稿在Notion上交流文档在Zoom上进行视频会议等等。随着 Web能力的越发强大大多数的在线工具都可以在网页上操作。
而这,给 noIM 的概念带来了可能。
noIM意味着一个即时通讯应用不仅仅做消息的发送与接受 —— 当然消息工具会一直是即时通讯应用迭代的核心 —— 更意味着应当承担一种多人协作的流转工具与职责。因为IM天然的就代表着互联网时代最基本的沟通与协作方式。我们可以基于IM无缝的连接各种各样的工具。想象一下我们可以在同一个工具中完成之前需要切换多个工具才能做到的事情而且这些工具可以通过中心的IM来进行一定程度上的交互。
![](/img/intro/connect-apps.excalidraw.svg)
如Slack, Discord这样优秀的聊天系统也提供了开放平台让第三方应用能够与聊天应用产生一定的交互但是我认为这还远远不够目前的现有的集成方式只不过是在发送一个个链接罢了在新的时代我们需要更加原生的集成方式。很多东西本就该产生共享与联系——比如账户系统、权限系统、群组关系等。
一个基本的noIM系统应当有一套开放式的设计来让其能够与其他工具以一种原生的方式结合在一起或者说自己来实现所有的可能的协作方式 —— 如 G Suite然而这种方式可以做到应用之间流转十分顺畅但是我认为更好的方式是连接第三方应用用户有选择自己喜好工具的权利那么设计一套足够开放的设计则是一种必然。
因此,我设计了[Tailchat](https://tailchat.msgbyte.com/) 这样的一种产品除了拥有和现有的流行项目都有开放平台以外Tailchat还提供了一套插件机制来帮助实现更加深入的集成。通过 Tailchat 的插件机制, 任何产品都可以直接获取到 Tailchat 的现有的一切上下文比如用户体系、权限体系等。更加重要的是Tailchat是开源且开放的这意味着Tailchat 拥有更好的隐私性,能够很好的开发插件,易于制作独属于用户的工具。在这一点和 VSCode 所要打造的生态是一样的但是与VSCode不同的是Tailchat 作为IM天然能够带来更多的交互这是聊天软件天然的优势。也是我相信noIM能够在未来大放异彩的原因。
Github: [https://github.com/msgbyte/tailchat](https://github.com/msgbyte/tailchat)
官方文档: [https://tailchat.msgbyte.com/](https://tailchat.msgbyte.com/)
在线尝试: [https://nightly.paw.msgbyte.com/](https://nightly.paw.msgbyte.com/)

View File

@@ -0,0 +1,14 @@
---
title: 版本发布日志 v1.6.7
authors: moonrailgun
image: /img/logo.svg
slug: release-1.6.7
keywords:
- tailchat
tags: [Release Note]
---
- 增强个人品牌定制,允许自定义服务器登录入口的名称与背景图(图片没有文件上传限制)
- 优化了后台管理平台的内存占用占用内存只占原来的1/4左右
- 后台管理平台增加了converseID的过滤
- 修复了一些bug

View File

@@ -0,0 +1,46 @@
---
title: Tailchat 群晖部署记录
authors: reacher
image: /img/logo.svg
keywords:
- tailchat
- deploy
tags: [blog]
---
- 应用名: Tailchat
- 官网: https://tailchat.msgbyte.com/zh-Hans/(中文)
- GitHub: https://github.com/msgbyte/tailchat
----------
部署环境及方式: 白群晖720+,docker-compose部署, 有二级域名及ssl证书。
部署步骤:
1. git下载docker配置文件
Docker目录下新建tailchat文件夹,并将以下文件存于文件夹中:
> https://github.com/msgbyte/tailchat/blob/master/docker-compose.env
> https://github.com/msgbyte/tailchat/blob/master/docker-compose.yml
2. 修改docker-compose.env
> SECRET=:加密秘钥,自定义字符串
> API_URL=:对外可访问的url地址
> ADMIN_USER=:管理员用户
> ADMIN_PASS=:管理员密码
3. 拉取镜像及开启服务
ssh到群晖,切换到/volume1/docker/tailchat文件夹,运行: `docker-compose up -d`部署完成。
4. 外网访问配置-路由器
打开路由器端口转发功能,增加一条转发记录,8800到群晖的8800端口
5. 群晖反代设置
控制面板 > 登录门户 > 高级 > 反向代理服务器 > 新增
```
来源:https,域名,端口:8800
目的:http,群晖IP,端口:11000
```
自定义标题 > 新增 > websocket, 自动增加两条数据,点击保存。
6. 通过https访问系统。

View File

@@ -0,0 +1,14 @@
---
title: 版本发布日志 v1.6.8
authors: moonrailgun
image: /img/logo.svg
slug: release-1.6.8
keywords:
- tailchat
tags: [Release Note]
---
- 优化表情面板性能,重构单个表情的渲染方式。
- 修改了消息中url的样式增加了点状下划线用于强调
- 增加了发送按钮,当消息输入框内有内容时会将 + 号变成发送按钮,优化移动端发送消息体验
- 修复部分文案错误,修复头像路径解析错误,修复网页面板输入不带协议头的路径会套娃的错误

View File

@@ -0,0 +1,18 @@
---
title: 版本发布日志 v1.7.0
authors: moonrailgun
image: /img/logo.svg
slug: release-1.7.0
keywords:
- tailchat
tags: [Release Note]
---
- 增加了wxpusher插件用于消息通知
- 增加了更多的markdown语法支持(如表格)
- 增加了markdown文本编辑器
- 优化了消息通知的显示,移除了富文本标签
- 插件文档增加了http协议地址的支持
- 插件中心增加了开放平台和第三方集成的插件入口
- 个推推送增加了请求id记录用于排查问题
- 优化移动端环境下内容面板的切换显示使用transform而不是width

View File

@@ -0,0 +1,147 @@
---
title: "Tailchat x Laf: 十分钟开发一个对话机器人"
authors: moonrailgun
image: /img/logo.svg
slug: tailchat-laf-robot
keywords:
- tailchat
- laf
tags: [Guide]
---
## 简介
[Tailchat](https://github.com/msgbyte/tailchat) 是一个开源的 **noIM(not only IM)** 应用,除了一般的即时通讯功能以外还包含完整的开放平台和插件生态。本次我们就要使用 `Tailchat` 的开放平台.
[Laf](https://github.com/labring/laf) 是一个开源的 **serverless** 云开发,提供云函数、云数据库、云存储等开箱即用的应用资源。本次我们要用的是他提供的云函数。
因为这两个平台都非常方便所以我们只需要10分钟就能开发一个完整的对话机器人。
## TLDR
### 创建开放平台应用
废话不多说,我们直接开干。
首先我们需要在Tailchat的开放平台中创建一个开放平台应用。
在创建前我们需要先安装相关的插件因为Tailchat的能力都是封装在不同的插件中的如果没有安装插件的话部分能力是不可见的。
我们需要安装开放平台插件(com.msgbyte.openapi)与第三方集成(com.msgbyte.integration)插件
![](/img/blog/robot-with-laf/1.png)
然后我们就能在左下角的设置页面看到我们的开放平台插件
快速创建一个应用:
![](/img/blog/robot-with-laf/2.png)
![](/img/blog/robot-with-laf/3.png)
创建完毕后点击 **Enter** 进入应用详情页。
![](/img/blog/robot-with-laf/4.png)
此时我们可以拿到两个东西,一个是 **appid** 用于标识app的唯一id一个是 **appsecret** 用于进行服务进行交互。可以简单理解为开放平台应用的账户名和密码。
点击小眼睛显示不脱敏的完整秘钥。这两个字段我们接下来要用到。
### 创建laf云函数
接下来我们来创建云函数用于机器人的后台服务。
首先在 [laf](https://laf.dev/) 中登录/注册账号并创建一个应用。
`laf` 为每个账号提供一个免费的实验应用可以用于快速尝试,我们直接创建免费的即可
![](/img/blog/robot-with-laf/5.png)
等待应用启动完毕后我们就可以直接在网页上进行代码的编写。
点击左上角加号创建一个云函数
![](/img/blog/robot-with-laf/6.png)
在左下角依赖中安装 **Tailchat** 官方提供的 `tailchat-client-sdk` 包用于快速开发
![](/img/blog/robot-with-laf/7.png)
点击保存后应用会自动重启此时你的应用就相当于安装了这个包了。此时我们可以直接引入如果包里面有ts的类型的话网页编辑器还会有类型提示。
点击函数快速写入如下内容:
```ts
import { TailchatClient, stripMentionTag } from 'tailchat-client-sdk';
const host = '<your tailchat instance backend host>';
const appId = '<appId>';
const appSecret = '<appSecret>';
const client = new TailchatClient(host, appId, appSecret)
export async function main(ctx: FunctionContext) {
console.log('receive', ctx.body);
const type = ctx.body.type;
if (type === 'message') {
const payload = ctx.body.payload;
try {
const message = await client.replyMessage({
messageId: payload.messageId,
author: payload.messageAuthor,
content: payload.messageSnippet
}, {
groupId: payload.groupId,
converseId: payload.converseId,
content: `Your message: ${stripMentionTag(payload.messageSnippet)}`,
})
console.log('send message success:', message)
} catch (err) {
console.log('send message failed:', err)
}
}
return { data: 'hi, laf' }
}
```
在代码顶部的 `host` / `appId` / `appSecret` 分别填入对应的内容,其中 `host` 就是你自己部署的 `Tailchat` 后端的地址。如果你用的是官方的`nightly`环境可以直接填入 `https://tailchat-nightly.moonrailgun.com`
代码逻辑非常简单,就是接收来自`Tailchat`推送的消息,并将接收到的内容原样回复。
完成代码的编辑后点击右上角的发布按钮将代码发布到线上,同时也可以看到`laf`提供了一个可供外网访问的url, 这个url需要记录一下我们之后会用到。
![](/img/blog/robot-with-laf/8.png)
此时,我们的机器人服务就已经完成了。
### 机器人配置
这时我们回到 `Tailchat` 中。我们还有一些步骤尚未完成。
重新打开应用详情,切换到机器人标签。开启机器人功能并将我们在 `laf` 中拿到的 `url` 填入回调地址中
![](/img/blog/robot-with-laf/9.png)
然后把我们的机器人添加到群组中,在群组左上角打开详情
![](/img/blog/robot-with-laf/10.png)
在左边找到集成功能输入appid找到应用点击添加机器人到群组按钮。
![](/img/blog/robot-with-laf/11.png)
此时我们在频道中@机器人并输入内容后,就可以看到机器人进行了相应的回复
![](/img/blog/robot-with-laf/12.png)
自此,一个简单的对话机器人就完成了。
如果想要别的功能,直接修改机器人的源码即可。通过机器人我们可以让 Tailchat 与各种各样的服务进行连接。
## 相关连接
- [Tailchat](https://tailchat.msgbyte.com/)
- [Laf](https://laf.dev/)

View File

@@ -0,0 +1,20 @@
---
title: 版本发布日志 v1.7.4
authors: moonrailgun
image: /img/logo.svg
slug: release-1.7.4
keywords:
- tailchat
tags: [Release Note]
---
- 新版admin已发布可以通过[部署文档](/docs/deployment/admin)抢先体验
- 增加入群欢迎插件,支持变量与富文本
- 聊天框支持多行文本
- wxpusher 增加发送者昵称提示
- 增加打开用户popover时缓存自动更新机制
- cli增加smtp校验功能用于校验smtp uri
- 修复群组设置更新操作不生效的bug
- 修复输入回车键发送图片会同时在输入框追加换行符的问题
- 修复修改配置修改标题图标不会跟着刷新的bug
- 修复部分已知问题

View File

@@ -0,0 +1,15 @@
---
title: 版本发布日志 v1.7.5
authors: moonrailgun
image: /img/logo.svg
slug: release-1.7.5
keywords:
- tailchat
tags: [Release Note]
---
- 修复权限逻辑检测修复身份组设定后权限不生效的bug
- 后台管理平台增加头像地址预处理
- 后台管理平台增加引用类型
- 后台管理平台增加自定义header和footer
- 调整邀请策略,当未登录情况下引导到登录页面而不是注册页面

View File

@@ -0,0 +1,20 @@
---
title: 版本发布日志 v1.7.6
authors: moonrailgun
image: /img/logo.svg
slug: release-1.7.6
keywords:
- tailchat
tags: [Release Note]
---
- 增加了封禁/解除封禁用户功能
- 增加了好友备注功能
- 备注功能会应用在群组成员列表/用户会话/提及/会话标题等地方
- 后台增加消息数量统计
- 后台增加了缓存管理,现在可以通过后台清空缓存了,对于不了解 redis 的用户非常友好
- 后台配置增加了 `disableGuestLogin``disableUserRegister` 的显示
- 后台首页增加了每日新增用户数的统计
- 邮件模型增加了创建时间和更新时间
- 并调整了部分字段
- 后台优化了消息内容和id字段的显示

View File

@@ -0,0 +1,57 @@
---
title: Tailchat 压测报告新鲜出炉万人消息广播完全接受只需1.2秒
authors: moonrailgun
image: /img/logo.svg
slug: benchmark-report
keywords:
- tailchat
- benchmark
tags: [Report]
---
作为一个即时通讯应用Tailchat 天然就需要具备能够处理高并发多人在线能力的需求。
为了衡量`Tailchat`在处理大批量用户上的处理能力,给予我们的客户有足够的信心,我们决定花时间来测试在实际生产环境中实际表现。
因为为了面对来自不同程度与需求的用户的规模要求,`Tailchat` 的底层设计是基于分布式架构,这意味着我们可以通过水平扩容来承载不同的规模的业务需求。
但是分布式的缺点也在于花费了更多的资源在数据的通讯与转发上,在小规模的运行中比不上传统的集中式架构来的快。
这看上去是一个鱼和熊掌不可兼得的矛盾,但是为了同时获得两者的优势,`Tailchat` 在单实例部署上做了一些特殊的优化,即最短路径原则。这意味着在微服务之间相互调用中如果有且只有自身可以消费则跳过转发阶段直接把请求发送给自身。
这使得如果性能足够的情况下,单机的能力会优于集群。而当单机无法支撑足够的业务需求时,切换为集群部署用多个实例一起来承载高需求的业务规模。
![](/img/architecture/transport.excalidraw.png)
## 压测方式
为了衡量 Tailchat 在多人在线情况下表现,我们选择了消息发送与接收能力作为衡量标准。
即: **当一个群组中有若干人同时在线时,一条消息从发送开始到所有在线用户都接收到消息的转发这条完整链路所需要耗费的时间**
> 因为对于IM项目来说传统的90分位/99分位数据是无意义的只有所有用户都能接收到广播的消息、不丢失才是最基本的能力表现。因此对于Tailchat的要求也是只看消息传播耗时的100分位数据
同时,测试在多人在线时,**常驻**cpu与内存的**增长表现**
> 本次测试由 [sealos](https://sealos.io/) 提供集群服务支持。sealos 真的很方便!
压测方式主要分为三个步骤:
1. 批量注册用户,并把注册后系统返回的凭着(Token)记录到本地文件
1. 加载上一步存储的token并按照token进行登录并建立长连接。当所有用户登录完毕后记录常驻资源增长。
1. 当所有用户登录完毕后,选定一用户连接并发送消息到指定群组的指定频道,同时记录开始时间。当所有的连接都接收到这条消息后,记录结束时间。此时记录结束时间,计算中间耗时。该方法统计数次得到多组数据以消除误差。
## 压测概述
本次压测分别测试了 100用户、500用户、1000用户、2000用户、5000用户、10000用户同时在线且在同一个群组的性能表现。
为了尽可能压榨 `Tailchat` 的性能我把选择使用最低限度的配置上限来测试尽可能多的服务。在3实例的case中最高支撑到800人就出现问题了拓展到5实例后成功支撑起1000用户但是当用户同时在线人数上升到1300左右的时候又出现了瓶颈。此时我猜测可能是因为linux系统自带的ulimit导致的毕竟在此之前没有做好相关的定向优化。此时我觉得集群测试可能要暂时告一段落了我转移到window平台。
果然不负我的期待在windows平台没有相关的限制成功让 `Tailchat` 的在线人数突破到 2k、5k乃至10k的限制。此时我认为我们本次的压测工作已经符合一开始的期待了。毕竟万人同群已经达到的同等行业的上限。当然我认为其上限远不止于此因为还有很多的优化空间。
在最高的 10000 用户用例中我们测试了5次从消息发送到所有用户接受到消息的耗时。最终我们发现 `Tailchat` 给出的答卷是1.2秒, 即1.2秒内一条消息会发送到所有的用户。这个数据我认为还是比较理想的毕竟有1万人同时在线的群往往实际人数会达到10万人以上。当然在后续对大量用户的情况会进行进一步优化这个数据只会是一个起点而不是一个终点。
## 完整报告
具体的压测报告可见: [压测报告](/docs/benchmark/report)

View File

@@ -0,0 +1,23 @@
---
title: 版本发布日志 v1.8.0
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.0
keywords:
- tailchat
tags: [Release Note]
---
- 新版admin已经正式上线替换旧版admin系统
- 如果还是期望使用旧版的admin系统可以使用`admin-old.yml`, 在后续版本中镜像将不会继续构建旧版admin如果你有什么需求是需要旧版admin但是新版admin没有支持的请尽快开启issue告知我们
- 优化了聊天页面的字体美化在windows平台上的字体表现
- 修复了在用户名包含空格时@功能的用户名称无法正常显示的bug
- 修复了临时用户可以验证邮箱的bug
- 增加了admin文件路径的预处理
- 增加了群组独立页面,现在可以把群组页面单独抽离出来了
- admin增加批量删除
- admin增加用户字段显示逻辑
- cli增加了`smtp test`命令你现在可以通过cli工具快速发送测试邮件来验证整条链路
- cli增加了各类压测命令用于测试用户在线人数
- health接口增加了更多上下文包括实例id进程信息
- 发布了压测报告,你可以在这里看到压测报告内容: [Tailchat 压测报告新鲜出炉万人消息广播完全接受只需1.2秒](./2023-06-19-benchmark-report.md)

View File

@@ -0,0 +1,21 @@
---
title: 版本发布日志 v1.8.1
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.1
keywords:
- tailchat
tags: [Release Note]
---
- 增加第三方登录插件(com.msgbyte.iam),目前支持`github`登录, 相关部署文档见 [iam - Third party login](https://tailchat.msgbyte.com/docs/advanced-usage/plugins/com.msgbyte.iam)
- 收件箱支持markdown格式的内容
- 增加系统消息发送能力目前支持单人发送与所有人发送markdown格式的通知。可以在admin后台看到该功能入口
- 所有人根据服务器注册用户数量发送,如果人数过多不保证能实时收到。
- 增加了注册时允许修改昵称,强化用户修改昵称意识
- 增加了`com.msgbyte.env.electron`插件,为桌面端做准备
- 美化仪表盘图表颜色
- 美化github star提示增加emoji
- 修复一些已知问题
另外,桌面端将于不久之后会发布第一个内测版本

View File

@@ -0,0 +1,119 @@
---
title: 分享下这几年我是如何运营开源项目并达到1k star的
authors: moonrailgun
image: /img/logo.svg
slug: share-1kstar
keywords:
- tailchat
tags: [Share]
---
我开发了一款 IM 项目 [Tailchat](https://tailchat.msgbyte.com/)终于在2023年6月28日凌晨达到了 1k star 的里程碑。我感到非常激动。当然,对于许多知名开源项目来说,这只需要几天就可以完成,但对于我来说仍然非常重要。因此,我非常想分享一下我作为一个开源爱好者是如何运营开源项目的。
![](/img/blog/1kstar/1.png)
![](/img/blog/1kstar/2.png)
首先,我必须承认我是一个非常典型且纯粹的程序员。我没有背景,没有资源,也不擅长沟通,可以说是比较社恐的人。对于像我这样的人来说,困难并不在于如何开发一款应用,而是在开发完成或者达到一定阶段后如何推广我的应用,并让大家能够理解我的理念。
曾经,我天真地认为开源只是将源代码分享出去,让大家能够看到我的代码。然而,我逐渐意识到开源更像是一个企业,不仅需要开发自己的产品,还需要想办法将产品销售出去。
## 一个好的官网非常重要
官网是一个应用的门面对于许多库来说README就是它们的官网。然而对于相对庞大、复杂的项目来说简单的README可能无法提供足够多的信息这时一个独立的官网页面就变得非常重要。
一个优秀的官网能够增加用户对项目的信任感。通常情况下我对开源项目的基本信任感来自于以下几个方面是否有README或官网、是否有足够多的star以及使用量/下载量如何。
举个例子Tailchat的官网 https://tailchat.msgbyte.com/ 经过几次迭代后变得相当出色。首屏几乎占满整个页面,并展示了桌面端和移动端的预览图,这意味着我的项目同时支持桌面端和移动端。然后简洁明了地列出了我认为重要的特点,这些特点也是我希望我的产品与其他类似项目区分开来的关键点。
官网是产品思考的体现。通过官网向用户传达自己的想法,让用户理解你的设计哲学,明白你为什么要做出这样一个产品。
另一方面,官网也为用户在使用过程中提供指导。除非你的产品不需要用户做任何操作,只需打开即可使用(比如各种小游戏),否则一个完整的文档对用户的帮助远远超出你的想象。
不要认为只因为开源了源码就可以不去做这些事情,代码本身就是文档。回想一下自己的开发经历,在使用一个库时,除非万不得已,否则我们不会选择去查看源码。对于库来说都如此,更何况是一个完整的项目呢?
对于开源项目来说,一个完整且兼容多平台的部署方式是最基本的底线。
## 注重差异化
对于开源项目来说,向其他人介绍自己的产品的时候最简单的方式就是 xxxx 的开源替代品, 这里的 xxxx 一般是你耳熟能详的商业应用。这样可以非常快速的让用户对你的产品有一个很基本的概念。你也能通过大家的共识快速建立起一个基本的概念。
比如你想做个在线商城那么你就可以说自己做了个淘宝的替代品。比如你想做一个论坛那你可以说你是要做一个discuz的替代品。
但是,在说自己的项目是 xxxx 的替代品的同时需要时刻明确自己与对方的差异点而不是在不断复刻其他项目的功能。比如我在与其他人介绍、推广我的项目的时候我会说我是一个IM是discord/slack的开源替代品。但与此同时我也会强调不仅仅是一个IM。我会与对方谈论为什么我们需要插件系统以及插件系统可以给我们带来什么为什么我会花2年时间来做底层架构、打磨体系来完成这套架构以及为什么我觉得我的产品是优于其他的项目的。
这是一件非常困难的事情。因为大部分的用户并不会在乎你的差异。对于大部分用户来说只会用到最基本的功能,而且用户更加关注的是是否能满足自己的需求。一件非常悲伤的事情是不论做什么你都会有很多的同行与你竞争,让用户决定是否用你的产品的理由并不是因为你的功能多么强大,而在于你的功能是否能满足需求 —— 当然如果你的功能足够多,多到所有能想象到的需求都能满足也行。但是那是企业做的事情,如果你是个人开源者更要学会专注,专注于打差异化。
## 重视国际化市场
多国语言是非常必要的一件事。虽然中国有很大的市场,但是我们把目光放远一些,中国市场也不过是全球 1/5 的市场。特别是在开源领域,你作为开发者更加不必在乎语言的边界。因为你不受控于各地的法律法规隐私政策的差异。作为开发者只需要做好你的产品就行了。
因此,支持多国语言非常重要。至少支持英语,能很大程度扩展你的受众范围。如果你对自己的英语水平不够自信,请善用翻译软件。
另外,你可以多多去海外的平台宣传自己的应用,不仅仅是局限于国内的平台。如 Reddit、Hackernews、medium 等。因为海外的用户对开源的接受度、理解度更加高如果这些用户能够认可你的项目的话在开源领域会比国内用户带来的帮助更加多。一个很悲伤的事实是国内开发者天天996根本没有时间再去为开源做贡献特别是个人开源的项目。
## 通过完善的文档、自动化测试给用户带来信任感
虽然一本厚厚的说明手册并不会给产品本身带来任何的实际价值,但至少会让在这个产品上投入关注的用户感到安心。
安全感是一个很玄学的事情。作为开发者你可以说自己的项目非常简单易上手,根本不需要任何文档。但是哪怕不去看这些文档,这些文档存在的本身会给使用者一种信任,至少能表示你对自己的项目投入了足够多的关注。
类似的还有自动化的测试脚本,前者是给普通用户的,后者是给开发者的。
作为开发者我们都知道CICD的重要性。CICD是保证项目的代码质量的重要方式也意味着一个项目的底线。如果一个没有任何CICD工作流或者都是失败的工作流。那么我会非常对此非常具备不信任感。
开源项目天然的就相比商业项目是缺乏信任感的因为后者是拿来牟利的且是能够用来支持起企业的运作的意味着至少不会有什么问题。而开源项目往往起源于兴趣天然的就给人不靠谱的感觉。特别是在前期star数比较低的时候更是如此。
怎么打破这种不信任感也是作为开源的维护者想要让自己的项目起来的重要因素。
## 将你的内容串在一起,减少探索成本
一个非常不好的例子在于把相关的内容放的到处都是,让用户能看到所有的内容非常困难。
将重要的内容在一个地方被索引是非常重要的事情。比如你的社交媒体、你的文档、你的功能手册、你的演示环境、你的各种技术博客….
减少用户的探索成本,因为如果成本过高用户很有可能选择放弃。这就是为什么大多数网站都会在页脚留有各个关键
如果你仅README文件那就把所有的链接都添加到文档中让用户能够清除知道有什么内容这些内容是干什么的。
另外,不只是你的各种内容,你的项目本身也要牢记这一点。比如上来就是一个手机号注册就很容易让人劝退,而适当的公开内容体验可以更好的让用户体验到产品的魅力从而长期留存。在 Tailchat 中我是这么做的, 用户可以使用临时账号登录,只需要填入一个昵称即可体验到完整的功能。当用户决定长期保留你的账号时,你可以走注册流程认领该临时账号。如果想要让用户加入到你的社群中,你甚至可以把入口直接换成邀请链接。
类似的如果你的项目包含了多个子项目。monorepo会是比多个仓库更好的选择我曾经写了一篇博客就是从技术角度说的这个[谈论从把多项目合并成一个项目中获得的收益](http://moonrailgun.com/posts/2674f04a/) 。
从开源运营的角度来说,多个项目仓库不但更难让用户看清全貌,也会打击开源贡献者的信心,因为谁都期望大项目的贡献者上有自己头像,哪怕仅仅是改了文档的一个错别字。
## 重视社区的运营,重视生态
社区的运营是开源项目中非常重要的一环只有来自社区的不断反馈才能拉起开源项目的正循环。最简单的社区就是建立一个微信群或者discord群。我早期在运营的时候想着既然我自己是做IM的为什么要到其他的IM平台上去运营我的社区呢然而这是错误的因为作为开发者应当去迁就用户而不是让用户迁就你。如果用户更加喜欢用微信那么你就应当选择使用微信。如果用户更多使用discord那么你就应该在discord建立自己的社群。保持社群的活跃才是第一要素。
我非常喜欢Notion的大使文化与社区文化。建立良好的社区驱动的生态是一个成功的开源项目必不可少的基本素质。虽然我的项目还远远达不到这个阶段但我研究过很多成功的开源项目无一例外。简单的说开源是理想主义者的狂欢一个好的开源项目则是一群理想主义者的狂欢。让用户认可你的项目并自发的宣传这是一件非常困难的一件事但是是有必要去做的一群人前进会比一个人前进轻松很多。
另外一方面需要关注开发者价值。什么是开发者价值呢就是你的项目对开发者能够带来什么。在推广Tailchat的时候我往往会与vscode进行类比。vscode就是插件化的文本编辑器。其本体就是一个拓展中心 + monaco 编辑器其价值在于良好的开发者生态。让不同的开发者能够通过vscode的插件系统来实现自己的想法集成不同的语言支持。不知道是否还有人记得在github还没被微软收购的时候 github有一款自己的编辑器 atom。我也非常喜欢用自从微软收购了github后atom就被弃用了。我相信微软也是看到了插件系统的巨大潜力。而Tailchat也是以插件系统作为设计之初的底层能力。我很喜欢的一句话是: 得开发者得天下。这也是生态的力量,当生态起来了以后,你的产品就很难被其他同类应用替代了。
## 恰当的时候回访你的早期用户
在早期维系种子用户是非常重要的,适时的回访你的早期用户,让你的用户感受到自己被重视,这个产品的积极性,这将会大大增加你的用户转变到社区贡献者的可能性。
很多技术人会觉得,只有代码贡献才是贡献。其实了解代码的毕竟是少数,更何况要匹配你的项目的技术栈的话就更加少了,很多人如果能提提建议,打打下手做个国际化翻译我觉得对于一个开源项目来说就非常不错了。最重要的是这些东西会成为你前进的东西。人想要不断前进要么靠金钱,要么靠兴趣,而社区就是持续不断为你的兴趣充能的加油站。
在我接触到的早期创业者,都会很喜欢与自己的用户约个会,聊一下自己项目的发展以及用户的看法。如果你觉得自己做不到这一点,用文字问候一下也是可以的。相信我,收获会比想象中的更加大。
## 积极写博客,写技术文章
我很反感像广告机器人一样在各种技术社区中通过不断的、重复的发送自己项目的介绍来推广自己的项目。虽然看起来好像有点读书人的清高和不食肉糜,但是我依旧觉得这种行为是非常影响其他人的体验的。有的人可能会说,相比有人黑总比没有人知道好,但这是牺牲其他人的体验而成就自己的自私行为。
我作为技术人的选择是,多写博客,多写技术文档。在技术文章中推广自己的项目。我期望这应当是一个双赢的行为:作为读者的你收获到了知识、作为作者的我收获了曝光。
同时写文章也是对自己思路的一个整理这点和写技术文档是差不多的。曾经的我非常反感写技术文档因为直接写代码就能写完的东西还需要写技术文档来约束自己。一般来说写技术文档的时间和写代码的时间是差不多的因为要写出一个正确的技术文档往往需要确定方案的可能性基本上确定方案的可行性大部分的代码就写的差不多了。而现在我会理解写技术文档的必要性更多的是为了整理自己的思路。写代码是简单的写代码让人能够理解是困难的写了代码以后让人能够理解并且后期好维护是最难的。曾经的我是依赖自己的经验来实现后期易于维护而技术文档就是在我依赖经验的基础上追加了一层CICD来约束行为。写技术文章也是一样的在闷头写代码的同时要把东西整理出来形成方法论。这也是一种对自己能力的提升。
## 总结
开源的到底是坎坷的,而且大概率是最后没有实际收益的。这也是为什么我会说开源是理想主义者的狂欢。
开源项目往往不追求盈利,付出又多,除了写代码还要投入精力去宣传,去运营。对于大部分人来说都是一件吃力不讨好的事情。
当然我这里说的是真正的、需要长期付出的开源项目。如果仅仅是为了star高来用于求职或者其他目的的话其实有很多方式很多项目代码没几行但是star数都是几十k这样的蹭热点的项目在github上还是有不少的。
相反的我的选题无疑是红海中的红海在C端十几年前就有早早占领了市场的巨头在B端也有很多强大的竞品进行竞争。同样在开源也有无数的同类产品相互竞争。我之所以依旧选择IM作为我的开源项目方向并且为止付出了数年的努力。我也相信我的设计理念会在一堆同质化严重的同类竞品中脱颖而出当然不可否认的是会有失败的可能可能这就是理想主义者我愿意为我的理想付出心血。
我相信,世界往往是被理想主义者所改变的。如果可以选择,我更喜欢与一群理想主义者一起共事。相信看到最后的你也一定是一位热爱着开源的人,共勉,一起走下去。

View File

@@ -0,0 +1,19 @@
---
title: 版本发布日志 v1.8.2
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.2
keywords:
- tailchat
tags: [Release Note]
---
:::info
桌面端测试版 v0.0.1 已发布目前只支持windows端
你可以在[下载页面](https://tailchat.msgbyte.com/zh-Hans/downloads)获取到该内容
:::
- 修复admin鉴权问题导致无法正常操作的严重bug
- 修复admin图表配色问题
- 修复移动端获取服务器自定义名称时无法正确获取到内容的错误

View File

@@ -0,0 +1,24 @@
---
title: 版本发布日志 v1.8.3
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.3
keywords:
- tailchat
tags: [Release Note]
---
- 增加了离线图标插件并作为默认内置插件现在在全内网环境下也可以正常使用tailchat了
- 增加了探索插件(com.msgbyte.discover),用户可以通过探索页面加入群组
- 探索插件的群组卡牌目前只允许后台手动添加记录
- ![](/img/blog/release-note/v1.8.3/1.png)
- 增加了群组描述功能,目前仅能展示在探索页面群组卡牌中
- 群组概述中增加了群成员数显示
- ![](/img/blog/release-note/v1.8.3/2.png)
- Admin 首页统计时间由7天改为14天
-`com.msgbyte.linkmeta` 插件添加为官方内置插件
- ![](/img/blog/release-note/v1.8.3/3.png)
- 修复侧边栏滚动条出现会导致徽标位置偏移的问题
- 修复AI助手插件返回结果太长导致无法看到所有内容的问题
- ![](/img/blog/release-note/v1.8.3/4.png)
- 优化了部分请求的缓存管理

View File

@@ -0,0 +1,54 @@
---
title: 版本发布日志 v1.8.4
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.4
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### 增加了群组邀请码使用次数统计与使用上限控制
你可以在创建时进行二次编辑,也可以在群组面板中邀请码管理进行编辑
![](/img/blog/release-note/v1.8.4/1.png)
![](/img/blog/release-note/v1.8.4/2.png)
![](/img/blog/release-note/v1.8.4/3.png)
对于非创始人角色进行编辑,需要给予编辑权限才能进行编辑
![](/img/blog/release-note/v1.8.4/5.png)
另外,现在可以在群组邀请码设置中看到邀请码用量情况了(之前的使用情况不会被统计)
![](/img/blog/release-note/v1.8.4/4.png)
#### 增加了群组背景图片功能
现在可以以群组为维度增加背景图片了,你可以在`群组详情 -> 设置`中看到该设置项
![](/img/blog/release-note/v1.8.4/6.png)
目前可以在邀请加入页面中看到
![](/img/blog/release-note/v1.8.4/7.png)
### 其他更新
- 增加了环境变量 `DISABLE_PLUGIN_STORE` 禁用用户的插件中心页面
- 增加了环境变量 `DISABLE_ADD_FRIEND` 禁用用户的添加好友等页面
- 修复github登录如果不存在邮箱情况下无法正常注册的bug
- 添加邀请码生成校验以防止极小概率下会出现两个相同邀请码的bug并在数据库层面增加了唯一性索引
- 修复服务器卡片亮色主题颜色适配
- 修复发送问题出现网络异常等情况无法发送时也会清理输入框的bug
- 优化 `com.msgbyte.discover` 插件的用户体验,对于已加入的群组会直接跳转而不是弹出加入群组失败的提示
- **桌面版**增加了reload等操作
- **桌面版**优化了文件下载操作,文件下载完毕后会自动打开文件夹
- 优化了github订阅的消息对项目增加了超链接
- 基于性能考虑移除了官网内置 `com.msgbyte.linkmeta` 插件

View File

@@ -0,0 +1,46 @@
---
title: 版本发布日志 v1.8.5
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.5
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### 全局公告
现在可以在 admin 管理平台中的 `系统设置` -> `公告` 功能来启用全局公告
![](/img/blog/release-note/v1.8.5/1.png)
点击提交后所有用户都会立即在页面上显示全局公告,如下:
![](/img/blog/release-note/v1.8.5/2.png)
用户可以点击最右边的关闭按钮来关闭本条通知。
另外如果公告内容比较复杂还可以选择添加公告链接,当链接不为空时则会在公告显示**了解更多**按钮
![](/img/blog/release-note/v1.8.5/3.png)
#### Admin 缓存管理优化
更加细分了 Admin 的缓存管理,因为我们意识到如果管理员只是通过修改环境变量来更新客户端的配置,但是却只能通过清理所有缓存来更新他,这是非常暴力的行为。
因此我们细分了缓存管理,单独抽出了清理客户端缓存的功能
![](/img/blog/release-note/v1.8.5/4.png)
### 其他更新
- 增加调用 `config.setClientConfig` 对所有的用户发送通知
- 修复了使用html面板可能会造成xss攻击的安全问题
- 优化了html面板的存储方式降低首次加载会产生的数据包压力
- 修复了iam插件使用github登录时用户可能会因为没有名字字段导致无法获取到昵称的情况
- 修复了插件列表可能会因为某种情况重复显示的问题
- 修复了上传gif图像可能会因为压缩算法导致无法播放的问题
- 优化了大数据情况下成员列表的渲染性能问题

View File

@@ -0,0 +1,23 @@
---
title: 版本发布日志 v1.8.6
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.6
keywords:
- tailchat
tags: [Release Note]
---
- 增加了桌面端接收到消息后会闪烁提示
- 桌面端增加了新版本更新提示功能
- 桌面版缩小了图标体积,从 1600x1600 -> 512x512
- 修复了关于面板中国际化翻译的问题
- `tailchat-client-sdk`增加了`TailchatWsClient`用于长连接场景下机器人的交互,相比于`TailchatHTTPClient`更加灵活
-`TailchatClient`更名为`TailchatHTTPClient`
- 在关于面板中增加了 `tushan` 的icon
- 追加了部分遗漏的离线图标
- 优化页面加载时间,并允许手动点击按钮刷新资源
- 优化了 `com.msgbyte.genshin` 的角色文本位置与样式,与图标更加贴合
- 优化了默认配置的内存占用,减少了实例数量。对于之前已经部署的用户更新配置建议先使用 `docker-compose down` 命令清理之前的容器后再使用`docker-compose up -d`启动
- 移除了旧版的admin系统减少镜像大小
- 移除了w2a源码

View File

@@ -0,0 +1,58 @@
---
title: 版本发布日志 v1.8.7
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.7
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### 可自部署的实时音视频解决方案
`Tailchat` 官方提供的第二个实时音视频解决方案, 把服务的选择权交给用户!为有自部署需求的用户打造,并优化了操作逻辑,更加简单易上手。
对于普通用户,你需要安装 `com.msgbyte.livekit` 插件
![](/img/blog/release-note/v1.8.7/1.png)
刷新页面重新加载插件就可以在创建群组面板时看到出现了语音频道的功能
![](/img/blog/release-note/v1.8.7/2.png)
你可以在加入群组前进行一些准备工作,比如打开摄像头调整一下位置,调整一下摄像头麦克风的媒体源等。
![](/img/blog/release-note/v1.8.7/3.png)
准备就绪后可以加入就可以加入频道会议与其他人在线畅聊。
![](/img/blog/release-note/v1.8.7/4.png)
在会议中你可以分享画面,开关自己的设备,与其他的与会者进行实时聊天。
> 注意,在会议中的聊天功能是不会被持久化记录的,但是对于灵活的 Tailchat 来说有一个小技巧是 pin 住一个常规的聊天频道,在那个频道中进行聊天,这样不论是与会者还是期望内容被持久化记录都可以达到
> ![](/img/blog/release-note/v1.8.7/5.png)
在房间外群组成员可以看到有哪些人正在会议中,所以如果有人在聊天,不妨直接加入他们!
![](/img/blog/release-note/v1.8.7/6.png)
![](/img/blog/release-note/v1.8.7/7.png)
另外,在会中请随意切换到其他的面板,并不会中断连接,你可以随时通过左下角的按钮快速回到当前所在的会话中。
![](/img/blog/release-note/v1.8.7/8.png)
> 关于多媒体服务器部署方案可见: [Livekit 插件部署指南](/docs/meeting/livekit)
### 其他更新
- 增加aliyunoss与其他第三方兼容aws s3协议的对象存储服务的兼容
- admin 用户列表增加`type``emailVerified`字段
- admin 修复群群组成员与面板统计错误的问题
- 修复 `tailchat-client-sdk` 依赖问题导致的类型错误
- 插件开发函数 `regCustomPanel` 增加了 `useIsShow` 字段用于显示或隐藏图标。

View File

@@ -0,0 +1,42 @@
---
title: 版本发布日志 v1.8.8
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.8
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### 增加分析功能
分析功能能够帮助你快速了解自己服务器的使用情况,对活跃情况一目了然
![](/img/blog/release-note/v1.8.8/1.png)
#### 添加本地消息以避免发生重复发送相同消息的网络错误
![](/img/blog/release-note/v1.8.8/2.gif)
在低速网络下,当消息发送后会立即上屏到消息列表,此时呈半透明显示。当发送成功后,会根据返回内容的情况更正为正常显示。
#### 优化未处理的好友请求提示
当有未处理的好友请求时,此时会在侧边栏和导航栏中进行提示,确保用户不会遗漏信息
![](/img/blog/release-note/v1.8.8/3.png)
### 其他更新
- 增加插件允许在注册后自动加入群组
- 只需要配置相应的环境变量即可生效,具体见文档: [com.msgbyte.autojoinGroup](/docs/advanced-usage/plugins/com.msgbyte.autojoinGroup)
- 增加按状态进行群组成员分组功能
- admin 增加添加创建群组功能
- admin 增加添加群成员功能
- admin 支持通过ID搜索群组和用户功能
- 添加对 antd 和 WebFastifyForm 的 i18n 支持
- 修复AI助手总结消息时会绕过撤回提示的问题
- 修复badge在侧边栏hover时会弹起的bug
- 修复在发送消息时可以操作本地消息的bug

View File

@@ -0,0 +1,42 @@
---
title: 版本发布日志 v1.8.9
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.9
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### 增加群组拖动排序
[#120](https://github.com/msgbyte/tailchat/issues/120) 用户将可以根据自己的喜好和优先级灵活地组织群组的顺序,优化实际使用体验
![](/img/blog/release-note/v1.8.9/1.gif)
#### 增加侧边栏直接创建多人会话的操作
![](/img/blog/release-note/v1.8.9/2.png)
![](/img/blog/release-note/v1.8.9/3.png)
### 其他更新
- 添加对 github 的 iam 代理支持
- 现在可以通过环境变量 `IAM_GITHUB_URI_AUTHORIZE` `IAM_GITHUB_URI_ACCESS_TOKEN` `IAM_GITHUB_URI_USERINFO` 修改远程请求地址了
- 调整多人会话策略,双人会话会复用之前的逻辑,多人会话会重复创建而不是重用之前的会话
- 这是为了适配同一批人可能会出现不同主题的讨论而准备的
- 修复群组角色添加多个用户时会出现报错的bug
- 修复渲染双人会话时可能会出现错误的bug
- 修复拖动聊天列表用户头像会导致异常的交互的问题 [#135](https://github.com/msgbyte/tailchat/issues/135)
- 修复操作重复推送并将显示重复用户的问题
- 修复badge组件会改变容器高度的bug
- 修复消息确认不触发更新问题
- 修复插件根路由路径不正确的问题
- 修复当环境变量 DISABLE_CREATE_GROUP 打开时引导代码会中断的bug
- 修复多个头像同时渲染时大小异常的bug
- 增加离线图标排序优化,减少无意义的更新
- 优化在低速网络下发送消息的体验
- 优化私信支持按照最近发言排序

View File

@@ -0,0 +1,38 @@
---
title: 版本发布日志 v1.8.10
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.10
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### 增加允许从群组中发起会议
![](/img/blog/release-note/v1.8.10/1.png)
在群组会话中的用户头像弹出层增加了快速发起会话的按钮,可以方便的向群组中的用户发起私信。
如果群组管理者不希望群组成员发起私信,可以在群组设置中主动关闭。
![](/img/blog/release-note/v1.8.10/2.png)
### 其他更新
- admin 消息列表增加刷新操作
- 修复消息发送越权风险问题 [#143](https://github.com/msgbyte/tailchat/issues/143)
- 为插件机器人(并非开放平台机器人)增加所有会话权限
- 桌面端修复接收消息任务栏无法闪烁的问题
- 修复了群组列表悬停时出现滚动条导致徽标闪烁的问题
- 修复浅色模式下危险按钮颜色错误的问题
- 修复userSetting的缓存键不正确的问题
- 修复被禁言后依旧可以在聊天框使用右侧输入框操作的问题
- 对部分高频发送的请求(之前有前端缓存的部分)增加了持久化缓存,减少因频繁刷新页面导致的前端缓存失效冲击后端服务
- 优化admin后台用户头像展示策略移除因null/undefined导致的问题
- 优化官网首页feature栏图标大小现在的体积约为原来的 1/3
- 增加数据库索引,优化数据量大情况下 `fetchConverseMessage` 操作的请求耗时
- 优化低速网络下更新群组配置交互
- 优化 `sentry` 插件入口文件大小,减少首次加载耗时

View File

@@ -0,0 +1,31 @@
---
title: 版本发布日志 v1.8.11
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.11
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### 开放平台应用管理强化
- 增加了应用名称、描述、头像的查看与修改
- 增加了返回应用列表功能
- 增加了删除应用功能
![](/img/blog/release-note/v1.8.11/1.png)
### 其他更新
- `admin` 添加文件删除操作,同时删除 `minio` 文件并允许通过 `objectName` 模糊匹配
- `OAuth` 增加自定义开放平台头像的显示支持
- 优化算法补全静态分析中缺失的离线图标
- 修复当 `DISABLE_ADD_FRIEND` 功能打开时添加好友按钮仍然显示的bug
- 修复无好友添加按钮跳转tab不正确的问题
- 修复修改用户设置后会发生图标闪烁的问题
- 修复在某些情况下用户设置缓存丢失导致用户修改数据过去的配置丢失的bug
- 开放平台修复头像解析问题导致的报错
- 优化群组拖拽排序逻辑增加了Y轴锁定

View File

@@ -0,0 +1,33 @@
---
title: 版本发布日志 v1.8.12
authors: moonrailgun
image: /img/logo.svg
slug: release-1.8.12
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### Markdown 编辑器 增加上传图片功能
![](/img/blog/release-note/v1.8.12/1.gif)
现在可以通过剪切板粘贴图片或者点击工具栏的图片图标上传图片文件
#### 在用户弹出窗口中添加在线状态
![](/img/blog/release-note/v1.8.12/2.png)
现在, 可以在弹出框中查看用户在线状态了
### 其他更新
- MarkdownRender 对原生html语法的支持
- admin: 用户搜索支持昵称模糊搜索
- 增加私信列表允许删除会话
- 修复没有类型头导致上传的svg在预览中无法直接渲染的问题
- 修复压缩图像后丢失扩展名的问题
- 优化小尺寸图片显示
- Markdown编辑器添加深色模式适配

View File

@@ -0,0 +1,39 @@
---
title: 版本发布日志 v1.9.0
authors: moonrailgun
image: /img/logo.svg
slug: release-1.9.0
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### 增加面板级别的权限控制管理
![](/img/blog/release-note/v1.9.0/1.png)
在权限注册中增加了panel字段当这个字段被设定并匹配到某一面板类型时权限将会在高级权限控制中显示
权限设计基于白名单形式。这意味着他会继承群组的权限。
示例一:
- 群组中该角色**拥有**【发送消息】权限
- 在面板中该角色**没有**【发送消息】权限
- 最终该角色拥有在所有文本面板的【发送消息】权限
示例二:
- 群组中该角色**没有**【发送消息】权限
- 在面板中该角色**拥有**【发送消息】权限
- 最终该角色仅在上述设定拥有权限的面板拥有【发送消息】权限,其他面板没有发送消息权限
> Q: 为什么tailchat会采用面板权限与群组权限取并集的形式而不是权限覆盖的形式
>
> A: 因为相比于很多固定设计的应用来说Tailchat需要考虑到插件的设计插件可以注册自定义的权限而这些权限是不受控的。只有在用户的操作中与实际使用中让用户养成白名单的权限管理习惯才会让当新的插件加入时不会出现权限失控的情况。另外覆盖的行为是更加不可捉摸的行为因为他会相互覆盖。
>
> 一个例子是如果我们想要让用户在某个面板没有权限但是其他的面板有权限那么最方便的做法是设定群组范围有权限而面板没有权限。面板的没有权限会覆盖群组的权限设计。但是这里有一个分歧在于我们并不知道用户期望的是默认有权限还是默认没有权限但是目前除某个面板以外都有权限这两者的差异在于当新的面板被添加时期望是有权限还是没有权限。tailchat想要消除这两种情况的差异对用户带来的心智覆盖和理解成本因此选择了最保守的方式设计权限系统。
### 其他更新
- 修复了一处可能的xss攻击因为我们允许iframe传入srcdom而这是可以注入行内样式代码的。

View File

@@ -0,0 +1,27 @@
---
title: 群组查看面板权限问题
authors: moonrailgun
image: /img/logo.svg
slug: view-panel-permission
keywords:
- tailchat
tags: []
---
由于新版本的群组权限,所有之前创建群组的群组用户都无法查看面板,因为失去了查看面板权限。
要批量更新所有群组权限,您可能需要下面的脚本。
进入 `mongodb bash`您可以在bash中使用脚本如下操作`docker exec -it <your-mongodb-container-name> mongo`
### 切换到 tailchat 数据库
```
use tailchat
```
### 更新所有组并向所有组附加 `core.viewPanel` 权限
```
db.groups.updateMany({}, { $addToSet: {fallbackPermissions: "core.viewPanel" } })
```

View File

@@ -0,0 +1,34 @@
---
title: 版本发布日志 v1.9.1
authors: moonrailgun
image: /img/logo.svg
slug: release-1.9.1
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### 增加面板展示权限
为了更好的控制展示内容,在本次更新中新增了面板展示权限,你可以在群组级别或者面板级别的权限控制中控制用户展示方式
![](/img/blog/release-note/v1.9.1/1.png)
你可以通过权限的组合来控制面板的显示与隐藏属性。
需要注意的是,群组级别的权限与面板级别的权限合并方式是合并而不是覆盖,这意味着如果开启了群组的权限,那么不论面板权限是否开启权限该用户都是有相关权限的
:::info
在本次更新后默认的群组权限将会丢失,这是因为增加了新的权限而过去的群组是没有授予该权限的,具体的修复方式可以阅读这篇博客了解更多: [群组面板可见性权限问题](/blog/view-panel-permission)
:::
### 其他更新
- 增加剪切板处理工具
- 默认增加url处理工具
- admin: 增加全部文件大小统计功能
- 修复linkmeta插件对bilibili视频链接的支持
- 修复linkmeta插件不匹配bbcode地址的问题

View File

@@ -0,0 +1,44 @@
---
title: 版本发布日志 v1.9.2
authors: moonrailgun
image: /img/logo.svg
slug: release-1.9.2
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### 增加桌面版分享屏幕的支持
![](/img/blog/release-note/v1.9.2/1.png)
现在可以在electron上点开屏幕分享并选中想要分享的窗口了
#### 增加桌面版增加原生浏览器渲染
支持打开因受到网页版限制而无法打开的网页
例如,如下是一个因为网站策略无法被嵌套显示的网页,受限于网页安全限制不会被嵌入
![](/img/blog/release-note/v1.9.2/2.png)
但是你可以打开网页原生渲染,使用内置的原生浏览器渲染替代嵌入网页
![](/img/blog/release-note/v1.9.2/3.png)
这样你就能突破对方网站的安全限制,自由嵌入任何页面,就像是在使用浏览器一样
![](/img/blog/release-note/v1.9.2/4.png)
> 如果切换后没有立即生效,可以按下快捷键 `cmd + r` 重新加载 `tailchat`
### 其他更新
- 增加文件访问次数记录
- 增加消息搜索接口
- **admin**: 支持删除私人消息
- 修复浅色模式下AI助手在popover中透明的问题
- 修复了在未加载富文本插件的情况下键入时出现 # 的错误
- 修复了文件上传同一文件时会导致数据库会重复记录文件的bug

View File

@@ -0,0 +1,28 @@
---
title: 版本发布日志 v1.9.4
authors: moonrailgun
image: /img/logo.svg
slug: release-1.9.4
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### 增加消息搜索功能
![](/img/blog/release-note/v1.9.4/1.png)
![](/img/blog/release-note/v1.9.4/2.png)
现在支持在会话中对聊天信息进行搜索因为是直接在数据库中搜索考虑到性能原因会有一个超时时间即5s内数据库没有返回搜索结果即视为超时。
### 其他更新
- http请求对对象存储与公共文件增加静态缓存
- 增加环境变量 `REQUEST_TIMEOUT` 用于自定义rpc请求超时时间默认**10 * 1000**, 单位毫秒
- AI助手增加更多提示
- 增加遥测信息收集(可以通过环境变量关闭)
- 修复 iam 插件不适合登录视图中的浅色主题的问题
- 为tianji脚本增加defer标记

View File

@@ -0,0 +1,52 @@
---
title: 版本发布日志 v1.9.5
authors: moonrailgun
image: /img/logo.svg
slug: release-1.9.5
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### livekit 插件增加成员面板
![](/img/blog/release-note/v1.9.5/1.png)
你可以在成员面板中查看所有参会者的列表,以及麦克风情况
#### livekit 插件增加多人会话发起音视频会话功能
![](/img/blog/release-note/v1.9.5/2.png)
现在你可以直接从私信会话中直接发起音视频呼叫了
#### livekit 插件增加多人会话自动邀请功能
当对方从私信会话中发送消息,则会自动发起邀请功能,如果接收方在线,则会弹出提示弹窗与铃声邀请加入会话(前提是接收方安装了livekit插件)
![](/img/blog/release-note/v1.9.5/3.png)
#### 群组成员列表允许右键快速修改身份组
![](/img/blog/release-note/v1.9.5/4.png)
现在允许在群组成员列表中通过右键菜单快速分配成员身份组,这对于需要频繁分配身份的场景非常好用
#### 增加好友列表搜索功能
![](/img/blog/release-note/v1.9.5/5.png)
为了进一步优化对于多好友情况的管理,增加了好友列表搜索框,用于基于好友昵称快速过滤好友,帮助用户找到好友。
### 其他更新
- 增加notification弹窗夜间模式支持
- 增加环境变量 MINIO_SSL 用于手动控制minio ssl适用于使用外部s3存储
- 设置页面增加重新加载按钮用于在非网页模式下方便重新加载tailchat
- 网页面板增加背景色选项,用于处理部分网页透明背景导致的样式问题
- 修复消息输入框背景色透明的bug
- 修复ban用户时清理缓存的时序问题可能导致的token过期不生效问题
- 修复了在私人对话中回复时收件箱 groupId 不正确的问题
- (desktop): v0.1.0 改进了服务器列表的管理

View File

@@ -0,0 +1,27 @@
---
title: 版本发布日志 v1.10.0
authors: moonrailgun
image: /img/logo.svg
slug: release-1.10.0
keywords:
- tailchat
tags: [Release Note]
---
### 特性更新
#### 音视频功能优化
- 增加app摄像头麦克风权限获取现在移动端可以正常使用音视频服务了
- 增加内嵌会话视图,优化在手机端上进行通话的体验
### 其他更新
- 添加基本信息编辑权限修复群组字段显示不正确的bug
- 为话题删除操作增加二次提示
- 修复话题已读可能会无法正常工作的bug
- 修复群组下拉菜单可能向上展开的错误
- 修复禁用插件不会禁用路由的bug
- cli smtp 测试命令添加关闭逻辑并在测试邮件中添加时间
- 在 livekit 插件中隐藏成员列表功能
- 添加虚拟用户以避免未使用的用户信息请求

View File

@@ -0,0 +1,17 @@
---
title: 版本发布日志 v1.10.1
authors: moonrailgun
image: /img/logo.svg
slug: release-1.10.1
keywords:
- tailchat
tags: [Release Note]
---
- 在群组/私信用户弹出框中添加机器人标签
- 添加机器人规则以禁止搜索引擎抓取邀请页面
- 允许在私信对话中使用 @ 提及功能
- 修复提及列表不会隐藏成员区分符的问题
- 修复 BBCode 自动转换逻辑
- 修复拖放功能的显示区域问题
- 为添加非消息功能的机器人添加友好提示

View File

@@ -0,0 +1,15 @@
---
title: 版本发布日志 v1.11.0
authors: moonrailgun
image: /img/logo.svg
slug: release-1.11.0
keywords:
- tailchat
tags: [Release Note]
---
- 增加了快速跳转命令面板,可以在任意地方通过`ctrl+k`快速打开
- 或者在导航栏通过点击搜索按钮打开
- 修复在某些情况会发送无效的userId导致整个用户信息查询请求报错的问题
- 修复了添加自己为好友时不恰当的错误提示
- 优化了提及功能在群组中包含大量成员时列表过长导致的性能问题

View File

@@ -0,0 +1,14 @@
---
title: 版本发布日志 v1.11.1
authors: moonrailgun
image: /img/logo.svg
slug: release-1.11.1
keywords:
- tailchat
tags: [Release Note]
---
- 增加消息右键菜单
- 增加设置项允许关闭右键菜单
- 优化了在消息右键菜单中通过选中复制部分文本的逻辑
- 修复命令面板无法鼠标点击的问题

View File

@@ -0,0 +1,11 @@
moonrailgun:
name: moonrailgun
title: Tailchat 创始人
url: https://github.com/moonrailgun
image_url: https://avatars.githubusercontent.com/u/6964737?v=4
email: moonrailgun@gmail.com
reacher:
name: Reacher
title: Tailchat 普通用户
image_url: /img/avatar/reacher.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 KiB

View File

@@ -0,0 +1,14 @@
{
"title": {
"message": "Blog",
"description": "The title for the blog used in SEO"
},
"description": {
"message": "Blog",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
"message": "最近",
"description": "The label for the left sidebar"
}
}