Code Monkey home page Code Monkey logo

88250 / symphony Goto Github PK

View Code? Open in Web Editor NEW
2.5K 35.0 461.0 45.69 MB

🎶 一款用 Java 实现的现代化社区(论坛/问答/BBS/社交网络/博客)系统平台。A modern community (forum/Q&A/BBS/SNS/blog) system platform implemented in Java. https://ld246.com

Home Page: https://b3log.org/sym

License: GNU Affero General Public License v3.0

HTML 6.69% Dockerfile 0.01% JavaScript 8.87% Java 54.41% CSS 0.13% FreeMarker 26.87% SCSS 3.00%
forum bbs sns community discussion java sym vditor markdown

symphony's Introduction

Sym

下一代的社区系统,为未来而构建





English

💡 简介

Symphony([ˈs ɪmf əni],n.交响乐)是一个现代化的社区平台,因为它:

  • 实现了面向内容讨论的论坛
  • 实现了面向知识问答的社区
  • 包含了面向用户分享、交友、游戏的社交网络
  • 100% 开源

欢迎到 Sym 官方讨论区了解更多。同时也欢迎关注 B3log 开源社区微信公众号 B3log开源

b3logos.jpg

⚡ 动机

很多社区论坛系统:

  • 界面风格老式,没有跟上时代发展的步伐
  • 缺少创新、好玩的特性,缺少现代化的交互元素和用户体验
  • 缺乏考虑实际运营需求,管理功能过于单一
  • 细节不够精致、缺乏长期维护

✨ 特性

内容编辑器
	Markdown(GFM)
	Emoji
	上传文件
		图片
		文件
		单独渲染 MP3
		单独渲染视频
	支持录音
	剪贴板处理
		粘贴内容处理为 Markdown
		粘贴图片自动重新上传
	@用户
	数学公式(LaTeX)、流程图支持
	快捷键支持
	工具栏
		表情
		粗体
		斜体
		引用
		无序列表
		有序列表
		链接
		上传
		预览
		全屏
	编辑模式
		传统的 Markdown 分屏编辑预览
		保留 Markdown 标记符的即时渲染
		类富文本编辑器的所见即所得
注册
	用户名
	Email
	邀请码(如果管理员启用)
	邀请链接
	验证码
	邮件验证
	新手向导
		上传头像
		关注标签
		关注用户
		帮助指引
登录
	账户(用户名/Email)
	密码
	忘记密码
		Email
		验证码
发帖
	帖子类型
		同城广播
		机要
		思绪
		问答
		普通帖子
	标题
	正文
		内容编辑器
		本地存储
	标签
		使用已有(选择、自动完成)或创建
		过滤
			黑白名单
			规范化
		默认“待分类”
	插入投票
		单选/多选
		结束时间
		是否公开投票人
	打赏区
		内容编辑器
		打赏积分
	匿名发布
		不可更新匿名状态
	发布后
		可更新
			历史版本
		可删除
	Sandbox 机制
回帖
	内容编辑器
	本地存储
	匿名发布
	是否仅楼主可见
	@参与者
	@单个用户
	回复(回复针对回帖,@针对用户)
	@V(小薇机器人)
	发布后
		可更新
			历史版本
		可删除
	自动关注帖子
活跃度
	发帖数
	回帖数
	参加活动数
	感谢帖子数
	感谢回帖数
	采纳回答数
	投票数
	打赏帖子数
	浏览数
积分
	积分规则
	充值
	提现
货币
	钱包地址管理(ETH)
	币种管理
浏览回帖
	浏览模式
		传统
		实时
	感谢
	采纳回答
	赞同
	反对
	举报
	折叠
		偏离主题
		已过时
	分享
	回帖高亮
		采纳的回答
		优质回帖
		Reddit 评论排序算法
	查看回复
	查看引用(原回帖)
	编辑自己的回帖
	查看历史
	引用统计
浏览帖子
	实时热度
	感谢
	赞同
	反对
	收藏
	关注
	举报
	置顶自己的帖子
	查看历史
	参与投票
	目录
	编辑自己的帖子
	发布时间/浏览数/回帖数/标签
	思绪播放/快速预览
	语音摘要播放
	分支主题
	上一篇/下一篇
	分享
		微信
		QQ
		微博
		Twitter
		分享链接(带用户标识)
	相关帖子
	缩略摘要
	图片代理
	爬虫统计
	引用统计
帖子列表
	领域
		相关标签
	最新
	优选
	同城
	搜索
	标签
		相关标签
		创建者
		贡献者
		关注/引用/回帖数
		所属领域
		关注
	排序
		默认(按发布时间降序)
		热议(按回帖数降序)
		好评(按评分降序)
		最近回帖(按最近回帖时间降序)
	首图
	实时热度
	最新回复
	回帖数
	是否查浏览过该帖(前端样式)
	创建时间
后台管理
	后台首页
		数据统计
			当前在线
			会员在线
			最高在线
			会员
			帖子
			领域
			标签
			回帖
		版本检查
	用户管理
		按用户名/邮件搜索
		添加新用户
		用户数据维护
			各字段数据
			用户状态
				正常
				未验证
				限制登录
				封禁
			高级更新
				用户名
				邮箱地址
			积分充值
			积分提现
			活动积分奖励
			违规积分扣除
			补偿初始化积分
	帖子管理
		按 id 搜索帖子
		重建所有帖子搜索索引
		添加新帖
		帖子数据维护
			各字段数据
			置顶/取消置顶
			重建搜索索引
			电报群推送
			锁定帖子
			删除帖子
	回帖管理
		回帖状态
			正常
			封禁
		内容数据
		删除回帖
	评论管理
		评论状态
		内容数据
		删除评论
	清风明月管理
		清风明月状态
		内容数据
		删除清风明月
	聊天室管理
		内容数据
		状态
	文件管理
	领域管理
		按名称搜索领域
		添加领域
		领域数据维护
			添加/移除相关标签
			名称
			URI
			描述
			图标
			是否用于导航
			状态
			CSS
			SEO
				title
				keywords
				description
			删除领域
	标签管理
		按名称搜索标签
		添加标签
		标签数据维护
			名称
			URI
			描述
			图标
			状态
			CSS
			SEO
				title
				keywords
				description
	保留词管理
		添加保留词
		保留词数据维护
			保留词内容
			删除保留词
	邀请码管理
		生成邀请码
		邀请码数据维护
			状态
				未使用
				已使用
				停用中
			备注
	广告管理
		首页展位
		首页顶部横幅展位
		侧边栏展位
		帖子外围展位
		帖子内嵌展位
		用户主页展位
		帖子列表展位
	角色管理
		内建角色
			管理员
			荣誉会员
			资深会员
			会员
			新手
			访客
		创建角色
		功能权限
	举报管理
		处理(奖励举报者积分)
		忽略
	审核管理
		发布/更新审核
			发帖审核
			回帖审核
			评论审核
		通过,可调整内容
		拒绝,可备注告知作者
		审核结果通知作者
	其他管理
		是否允许发布帖子
		是否允许进行回帖
		是否允许匿名浏览
		注册方式
			开放注册
			关闭注册
			邀请码注册
		帖子浏览计数是否排重
		语言
			按浏览器自动选择
			简体中文
			美式英语
		不显示列表的标签
	管理操作审计日志
		用户
		时间
		具体操作
		IP
		UA
浏览统计
	实时统计
		当前在线
		最高在线
		会员
		帖子
		领域
		标签
		回帖
		页面加载时间
	数据统计
		最近 30 天
		历史
		新回帖数
		新发贴数
		新用户数
消息通知
	消息数
	标记已读
	删除
	消息类别
		收到的回帖
		收到的回复
		收到的评论
		提及我的
			帖子内@
			回帖内@
			评论内@
			收藏
			关注
		我关注的
			关注的用户发帖
			关注的帖子
				贴主有更新
				帖子有人回
		积分
			感谢帖子
			感谢回帖
			采纳回答
			打赏帖子
			充值
			兑换
			扣除
			转账
			邀请注册
			帖子上优选
		同城
		系统
	Chrome 桌面提醒
活动
	领取今日签到奖励
	上证博彩
	字
	贪吃蛇
	五子棋
	聊天室
个人主页
	用户统计数据
	帖子
	回帖
	匿贴
	匿回
	清风明月
	关注帖子
	积分
	关注标签
	收藏帖子
	关注者
	GitHub 仓库
	举报
	关注用户
	站点连接
API
	B3
		博客发布博文 -> 论坛发布帖子
		博客更新博文 -> 论坛更新帖子
		博客发布评论 -> 论坛发布回帖
		论坛发布回帖 -> 博客发布评论
	客户端 APP
排行榜
	签到排行
	综合排行
	链接排行
	GitHub 排行
		仓库
		用户
	活跃度排行
	帖子排行
		打赏区
	积分排行
		财富排行
		消费排行
侧边栏
	广告位
	随机小贴士
	近期热议
	推荐标签
		图标
		简介
		引用数
		回帖数
	最新标签
首页
	领域、问答、关注、同城、最新帖子入口
	搜索、发帖、通知、个人等入口
	领域导航列表
	随机标签列表
	首页顶部横幅广告展位
浏览权限
	是否允许可以匿名(非登录)浏览
		按 URI 路径配置
		帖子可以单独配置
	机要:需要在文中 @ 到的用户才可以浏览的帖子
	对搜索引擎爬虫友好
邮件
	周精华订阅推送
	邮件服务
		SendCloud
		阿里云
		本地 JavaMail
搜索
	第三方 Algolia
	自建 Elasticsearch
	快捷搜索
		帖子
			标题
			正文
		标签
			标题
			描述
		用户
			用户名
			简介
	帖子高级搜索
		作者
		发布时间
		等其他条件
清风明月
彩蛋
	鼠标 ❤ 特效
	异次元空间
	领取昨日活跃奖励
用户设置
	基本信息
		昵称
		自我标签
		URL
		个性签名
		个人主页背景图
		个人卡片背景图
		站点连接
			GitHub
			StackOverflow
			Dribbble
			Behance
			Twitter
			Facebook
			Instagram
			Medium
			LinkedIn
			Telegram
			微博
			知乎
			QQ
			微信
	头像
	账号
		第三方登录
			QQ
			GitHub
			微博
			微信(公众号/开放平台/小程序)
		绑定手机
		绑定邮箱
		更新密码
		更新用户名
		永久停用账号
	审核
		可查看提交的审核申请状态
	安全
		两步验证(Google 验证器)
		登录日志
	邀请
		邀请链接
		兑换邀请码
	积分
		转账
	B3 同步配置
	功能
		个性化
			是否回帖后自动关注帖子
			是否启用站外链接跳转页面
			是否启用键盘快捷键
			是否订阅邮件
			是否启用 Web 通知
			回帖浏览模式
			分页每页条目
			自定义首页跳转
		设置常用表情
	界面
		切换主题
			Classic
			知乎
		模式
			明亮
			暗黑
			随日出日落自动切换
		头像浏览模式
			原图
			静态图
		帖子列表布局
			紧凑
			概览
	隐私
		是否显示 UA 信息
		是否公开帖子列表
		是否公开关注用户列表
		是否公开收藏帖子列表
		是否参与财富排行
		是否参与消费排行
		是否参与贡献排行
		是否参与 GitHub 排行
		是否公开积分列表
		是否公开回帖列表
		是否公开关注标签列表
		是否公开粉丝列表
		是否公开在线状态
		是否公开清风明月
		是否允许搜索引擎索引
		位置
			城市
			是否公开
	数据
		发帖/回帖数统计
		数据导出
	国际化
		常用语言设置
		所在时区设置
	钱包
		以太坊地址管理
		转账记录
	帮助
		使用入门
		基础知识
		键盘快捷键
		Markdown 教程
内容反垃圾
	随意的测试内容
	最大公共子串重复内容
	接入微信小程序内容安全接口
文件
	文件元数据
		文件名
		大小
		日期
		关联引用
		URL
	用户文件列表、总数、总大小
评论
	发布、更新、删除评论
	@通知
	点赞
	感谢

Sym功能.png

🎨 界面

以下截图来自 Sym 商业版。

首页

index

列表

list.png

帖子

article.png

发帖

post.png

用户 - PC 端

pchome.png

多主题

theme1.png

🛠️ 安装

请参考 Sym 安装指南

🏘️ 社区

📄 授权

  • 社区版:使用 AGPLv3 开源,如果你选择使用社区版,则必须完全遵守 AGPLv3 的相关条款;公司使用必须购买商用授权
  • 商业版:提供完整源码以便二开,报价 ¥20000,详情请看这里
  • 云服务:提供开箱即用的云端服务,每年 ¥5000(暂时售罄)

关于商业版和社区版的对比请看这里,企业网站、经营性网站、以营利为目的或实现盈利的网站请购买商业版。

🔓 已知的安全漏洞

🙏 鸣谢

  • jQuery:前端 JavaScript 工具库
  • Vditor: 浏览器端的 Markdown 编辑器
  • Highlight.js:前端代码高亮库
  • pjax:pushState + AJAX = pjax
  • Sass:前端 CSS 处理工具
  • jsoup:Java HTML 解析器
  • flexmark:Java Markdown 处理库
  • Apache Commons:Java 工具库集
  • Jodd:Java 工具库集
  • Latke:以 JSON 为主的 Java Web 框架

安全方面特别感谢:

symphony's People

Contributors

14790897 avatar 88250 avatar billho avatar cbamls avatar dependabot[bot] avatar dongxuwang avatar fuwei123456 avatar iboome avatar jy1989 avatar kyofin avatar mainlove avatar meikaiyipian avatar panjinghong avatar qiankunpingtai avatar sharksevenro avatar shminer avatar snowflake3721 avatar trydofor avatar uliian avatar vanessa219 avatar virtualpier avatar wangdx avatar westinyang avatar wuxiaochun1981 avatar zephyrjung avatar zh-h avatar zhengbao avatar zhoufengjob avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

symphony's Issues

用户隐私设置开关常量统一键名

  • USER_XXX_STATUS_C_PUBLICUSER_JOIN_XXX_C_JOIN 统一使用 USER_XXX_STATUS_C_ENABLED
  • USER_XXX_STATUS_C_PRIVATEUSER_JOIN_XXX_C_NOT_JOIN 统一使用 USER_XXX_STATUS_C_DISABLED

只涉及代码重构,数据库数据不用修改。

支持 Unix domain socket

增加启动参数 --unix_domain_socket_path 用于指定 Unix domain socket 路径,示例:

--unix_domain_socket_path=/dev/shm/sym.sock

NGINX 配置:

upstream backend {
    server unix:/dev/shm/sym.sock
}

感谢 @CismonX 贡献框架支持 88250/latke#27

在标签树上点击多个标签时,无法实现切换,只是点一个加一个

描述问题 Describe the problem

在标签树上点击多个标签时,无法实现切换,只是点一个加一个

期待的结果 Expected result

期待点击一个标签就切换一个标签,而不是多个标签累加在一块进行检索

截屏或录像 Screenshot or video

图片

版本环境 Version environment

  • 版本 Version:
  • 操作系统 Operating system:
  • 浏览器(如果使用)Browser (if used):

其他信息 Other information

Provide mechanism for non-Chinese supporters to pay

你在什么场景下需要该功能? In what scenarios do you need this function?

I love this product - and I would like to contribute to purchase a lifetime license. I could not figure out a way to do this. Please let me know if there is another way to contribute to activate the lifetime license.

移动端跳转到指定笔记

你在什么场景下需要该功能? In what scenarios do you need this function?

前置条件:同时使用PC端和安卓移动端,在启动思源时会进行云同步。在PC端添加了一条笔记
操作:

  1. 在PC端复制了新笔记的块超链接,通过第三方软件发送到了移动端
  2. 在移动端点击此链接
    预期:和PC端一样,可以打开思源笔记并定位到链接的笔记
    实际:可以打开思源笔记,但定位到最后打开的笔记,而非链接的笔记

docker

有docker镜像直接部署吗

支持 TextBundle

一直以来,md 文档插入图片都是问题:

  • 用图床链接,不稳定

  • 用本地文件链接,容易丢,也不方便分享

这也是我在用 md 做记录时候的烦恼。

不过,Marked 开发者和 Ulysses 团队开发出了一种解决方法,就是 TextBundle,简要解释一下,它是这样的结构:

一个叫 文档.textbundle 的文件夹或叫 文档.textpack 的zip压缩包,内包含:

o    一个 assets 文件夹,用于存放图片等附件

o    一个 info.json 文件,用于存放相关的元数据

o    一个 text.md 文件,用于存放文档内容。文档通过相对路径引用 assets 文件夹内的图片和其它媒体文件。

可以实现一个文包内,既包含 md 文档,也包含图片,预览时无需询问权限,同时又方便直接编辑,非常便捷。

每一个文档都存储在一个 textbundle 中,这样,即便导出,复制到其它设备、平台上,都可以用各种 markdown 编辑器打开文档,正常浏览里面的图片。

Ulysses, Bear这样的流行的写作工具,甚至是Mindnode等思维导图工具,都支持 textbundle。

如果支持textbundle格式。那么我们在快速写作的时候,就可以更加安心。因为我们确认所有的创作内容都可以方便导出带格式、带图片资源版本,轻松在其他专用工具中进一步加工。

重构请求路由

  • 废弃注解式路由 @RequestProcessing@RequestProcessor,使用函数式路由
  • 废弃注解式拦截 @Before@After,使用中间件处理

支持RSS订阅

你在什么场景下需要该功能? In what scenarios do you need this function?

支持用户使用RSS阅读器订阅

匿名机制 someone 改进

  • 初始化 someone 用户
  • 后端使用 someone 用户填充匿名内容作者
  • 前端不判断用户名,直接按后端填充的用户展现

运行时后台抛异常,但不影响功能

java.io.FileNotFoundException: File '/export/symphony-1/target/symphony/js/index.js' does not exist

index.js压根项目就没有这个静态资源。是属于非正常的请求吧?

对于文件所在合法目录判断上的缺陷

描述:

!new File(path).getCanonicalPath().startsWith(new File(Symphonys.UPLOAD_LOCAL_DIR).getCanonicalPath())) {

这段代码用于确保getFile()函数获取的文件的路径在UPLOAD_LOCAL_DIR目录上,但实际上这个判断语句对于文件路径符合/UPLOAD_LOCAL_DIR*/模板的文件也将返回真。

如UPLOAD_LOCAL_DIR = "/home/safe", 文件路径为"/home/safe_bak/filename", 因为文件路径是以"/home/safe"开头,所以会返回真。这就使得用户可以获取符合"/home/safe*/"特征目录下的文件。

如图所示:
unnamed

修复

使用 java.nio.files.Path.startsWith() 来替代原来的比较,该函数将对路径进行比较,而不是子字符串.
如果继续使用String.startWith()来比较路径, 需要确保被比较的路径以File.separator结尾, 如 String.startsWith(Symphonys.UPLOAD_LOCAL_DIR).getCanonicalPath() + File.separator).

代码位置:

!new File(path).getCanonicalPath().startsWith(new File(Symphonys.UPLOAD_LOCAL_DIR).getCanonicalPath())) {

Emoji alias inconsistent with Vditor/Lute

The "🙃" emoji, aliased as "upside_down_face" in lute's emoji map, appears broken in vditor's emoji tooltip.

The emojis in this tooltip are fetched from sym, where emojis and their aliases are maintained by an external package, com.vdurmont.emoji.EmojiParser, in which the emoji in question is aliased as "upside_down" or "flipped_face". Trying to find an emoji by "upside_down_face" alias will fallback to custom emoji, and fail in the attempt to fetch the image from CDN.

To fix this, either update sym's dependency, or change lute's emoji mapping.

更新前后端密码传递方式

目前,symphony 在前端计算密码的 MD5 后发送到后端进行登录,可能存在以下问题:

  • MD5 本身的安全问题。
  • 在后端进行比较时,可能存在定时攻击问题。

相关代码如下:

final String userPassword = user.optString(User.USER_PASSWORD);
if (userPassword.equals(requestJSONObject.optString(User.USER_PASSWORD))) {
    // ......
}

建议修改前后端密码传递方式,以下过程供参考,也可以参考 SpringSecurity 中的处理:

  • 前端通过静态资源或 API 获得 RSA 公钥。
  • 前端将用户的密码使用 RSA 公钥加密后发给后端。
  • 后端使用 RSA 私钥解密获得明文密码。
  • 后端对明文密码进行安全 Hash。
  • 后端 Constant Time 比对计算结果和数据库中的密码。

一个关于登录注册的问题

 final Request request = context.getRequest();
        final Response response = context.getResponse();
        //final JSONObject requestJSONObject = (JSONObject) context.attr(Keys.REQUEST);
        final JSONObject requestJSONObject = context.getRequest().getJSON();

LoginProcessor这段代码,在进行step 1 step2 阶段注册时,如果使用注释的那行将NPE,通过断点发现context.getRequest().getJSON()能够拿到正确的body 参数

关于商业版和社区版

看了商业版的对比,发现放在第一的是安全性,我个人是很难接受这一点的:
个人观点认为即便是免费社区版,也不应该在【安全性】上做妥协!

商业版可以在功能性上做扩充,而不应该把这个做为卖点。

20210114_101107

存储密码时使用安全 Hash 算法并加盐

目前,symphony 在数据库中存储用户密码的 MD5,相关代码如下:

final JSONObject user = new JSONObject();
user.put(User.USER_NAME, userName);
user.put(User.USER_EMAIL, email);
user.put(User.USER_PASSWORD, DigestUtils.md5Hex(password));
user.put(UserExt.USER_APP_ROLE, appRole);
user.put(UserExt.USER_STATUS, UserExt.USER_STATUS_C_VALID);

早在十余年前,MD5 已被证实不安全。因而,建议更新 Hash 算法并检查是否存在其它算法问题,一些供参考的算法如下:

  • 非对称加密算法:RSA2048 (国际) 、SM2(国内)。
  • 对称加密算法:AES256 (国际) 、SM4 (国内)。
  • Hash 算法:SHA256 (国际) 、SM3 (国内)。

此外,在存储密码时,需要加盐后进行 Hash,保证即使攻击者获取了数据库中的密码,也无法在短时间内破译以实现任意用户登录,相关实现可以参考 SpringSecurity 中的 BCryptPasswordEncoder。

可以给一个单元测试的demo

你在什么场景下需要该功能?

我在自定义一些service时,希望可以使用类似SpringBootTest的单元测试,可以很大程度上方便做测试覆盖,而不是仅能通过processor的返回值确定下层的repository、service等的正确性。

其他信息

可能也有过开发,尝试过检索黑客派,但是没有发现合适的相关文档
欢迎任何指教,非常感谢

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.