lowcoder-org / lowcoder Goto Github PK
View Code? Open in Web Editor NEW🔥 🔥 🔥 The Open Source Retool, Tooljet and Appsmith Alternative
Home Page: https://www.lowcoder.cloud/
License: GNU Affero General Public License v3.0
🔥 🔥 🔥 The Open Source Retool, Tooljet and Appsmith Alternative
Home Page: https://www.lowcoder.cloud/
License: GNU Affero General Public License v3.0
I've discovered that when an entry in the table has an children
-array, it will add an expand/collapse button to that row. Very neat!
However, it appears there is a significant performance issue when this feature is used. It's okay for tables with only a handful of rows. But once there is a lot to expand/collapse (my nested levels can go up to 4), the performance of the application will drop drastically.
When I show the same data as a flat list, it's pretty much a consistent performance.
I've made sure to check it's not my query or the logic before the table updates. It's not, the query runs and returns a (nested) result pretty much instantly.
Preferably loading the data into the table is just as fast as loading the flat list. However, keeping the application responsive (so not hanging the browser rendering) should be the priority.
Have a big tree with lots of data. My object looks like this:
{
id: 1234,
type: "string",
state: "string",
parent: 1234,
title: "string",
priority: 1234,
children: [], //Contains a list of this object again, up to 4 deep.
data1: 1234,
data2: 1234
}
I'd say test a very extreme scenario. I have 20 root items, each of which has about 3 childs, these have at least 20 childs each, which have about 4 childs each.
No response
No response
Is your feature request related to a problem? Please describe.
Currently, we are not able to configure the maximal data size for POST requests to the Lowcoder API.
This is relevant to control the max size for File-Upload and use of S3 Plugin for example.
Describe the solution you'd like
A ENV Variable should allow to control of the max-request-size and max-file-size for the Java environment.
Describe alternatives you've considered
Additional context
Add any other context or screenshots about the feature request here.
Is your feature request related to a problem? Please describe.
Currently, plugins can only be downloaded from the npm registry.
Describe the solution you'd like
It would be interesting for a Lowcoder developer to be able to choose the registry via which he wants to fetch a plugin that he has developed beforehand :
Describe alternatives you've considered
No alternative for instance.
When i like to delete a datasource in the Menu "Datasources", only a error is displayed.
(Network error / server not to reach)(Despite the API / Server is well reachable)
Datasources should be able to delete.
Create a Datasource and try to delete in the Main Menu section "Datasources"
No response
No response
Is your feature request related to a problem? Please describe.
Hi there!
An idea for a new feature: would it be possible to export/import themes, plz?
Describe the solution you'd like
I'd like to suggest adding a "clicked" event to the container component because it's a common design pattern and people are used to it.
Good morning everyone, I would like to report that since yesterday afternoon, there has been a problem with (Custom Component) . Does anyone know, why this problem occurred and if there is a solution.
Implement the description in the following documentation on the custom component
https://github.com/lowcoder-org/lowcoder/blob/main/docs/build-apps/component-guides/custom-component.md
In the app editor, drag and drop custom components onto the canvas.
No response
No response
Is your feature request related to a problem? Please describe.
Currently, there is no way to reset a password on Lowcoder Cloud if you have forgotten it. This can be a problem if you have lost access to your email address or if you have been hacked.
Describe the solution you'd like
I suggest that Lowcoder add a way to reset passwords, such as by sending a password reset link to the user's email address or by allowing users to answer security questions to reset their passwords.
When I'm placing a number input inside a list view, numerInput.value
only returns the value of the first row.
numberInput.value
should return an array of values like [0,2,0]
Put a list view inside an app. Put a number input inside the list view. Inspect the component output.
No response
No response
Eg {{input1.isValid(true/false}}
When default value is added to a select, no value is selected by default.
The default value should be selected.
No response
No response
I have some TextInput within a ListView. When I change the value of this TextInput, an event opens a notification with the current value of the TextInput. With some default values of the TextInput, the user input in this TextInput is not written in the notification.
This happens for example when the default value is taken from an object written in a temporary state. When I access the same value outside of a ListView, the notification gets the updated value as expected. When I build a trivial temporary state (i.e. just a string) the notification also receives the updated value correctly, even within the ListView.
Attached is a screenshot, where I update "input1", but the notifcation doesn't see that.
Referring to the screenshot, I would expect the notification to show:
Der wert ist: "State1 Variable 1 updated"
Reproducing the problem and playing around with the problem should be possible by importing this JSON:
{"applicationInfo":{"name":"exampleapp","createAt":1684753735243,"createBy":"646b4d3c2071810ba72f0f61","applicationId":"646b4d472071810ba72f0f73","applicationType":1},"applicationDSL":{"ui":{"layout":{"c656489f":{"i":"c656489f","h":18,"w":10,"delayCollision":true,"x":4,"y":13},"fe819418":{"i":"fe819418","h":5,"w":5,"x":4,"y":32}},"items":{"c656489f":{"compType":"listView","comp":{"noOfRows":"{{state1.value[\"value\"]}}","noOfColumns":"1","itemIndexName":"i","itemDataName":"currentItem","dynamicHeight":"auto","heightUnitOfRow":"1","container":{"layout":{"bf09b461":{"i":"bf09b461","h":5,"w":13,"x":0,"y":0},"e7e6ff80":{"i":"e7e6ff80","h":5,"w":11,"x":13,"y":0}},"items":{"bf09b461":{"compType":"input","comp":{"value":"{{state1.value[\"value\"][i][\"name\"]}}","label":{"text":"Label","width":"33","widthUnit":"%","position":"row","align":"left"},"onEvent":[{"name":"change","handler":{"compType":"message","comp":{"text":"Der wert ist: \"{{input1.value}}\"","level":"info"},"condition":"","slowdown":"debounce","delay":""}}],"validationType":"Text"},"name":"input1"},"e7e6ff80":{"compType":"input","comp":{"value":"{{state2.value}}","label":{"text":"Label","width":"33","widthUnit":"%","position":"row","align":"left"},"onEvent":[{"name":"change","handler":{"compType":"message","comp":{"text":"{{input3.value}}","level":"info"},"condition":"","slowdown":"debounce","delay":""}}],"validationType":"Text"},"name":"input3"}}},"autoHeight":"auto","pagination":{"changeablePageSize":null,"pageSize":"6","pageSizeOptions":"[5, 10, 20, 50]"}},"name":"listView1"},"fe819418":{"compType":"input","comp":{"value":"{{state1.value[\"value\"][0][\"name\"]}}\n","label":{"text":"Label","width":"33","widthUnit":"%","position":"row","align":"left"},"onEvent":[{"name":"change","handler":{"compType":"message","comp":{"text":"{{input2.value}}","level":"info"},"condition":"","slowdown":"debounce","delay":""}}],"validationType":"Text"},"name":"input2"}}},"tempStates":[{"name":"state1","value":"{\"value\": [{\n \"name\": \"State1 Variable 1\",\n}, {\n\n \"name\": \"State1 Variable 2\",\n}]}"},{"name":"state2","value":"\"state2 variable\""}],"refTree":{"value":"","items":[{"value":"state1"},{"value":"state2"}]},"hooks":[{"compType":"urlParams","comp":{},"name":"url"},{"compType":"momentJsLib","comp":{},"name":"moment"},{"compType":"lodashJsLib","comp":{},"name":"_"},{"compType":"utils","comp":{},"name":"utils"},{"compType":"message","comp":{},"name":"message"},{"compType":"localStorage","comp":{},"name":"localStorage"},{"compType":"currentUser","comp":{},"name":"currentUser"},{"compType":"theme","comp":{},"name":"theme"}],"settings":{"maxWidth":{"dropdown":"1920","input":0},"themeId":"default"},"preload":{"script":"","css":""}}}
When you have opened this app, change the value of the fields and see which match your expectation. Every notification should return what is currently written in the field you change.
Current Docker Mainline (https://raw.githubusercontent.com/lowcoder-org/lowcoder/21e92bde50125e736f6de6e8698fb2175ef91757/deploy/docker/docker-compose.yaml)
No response
Is your feature request related to a problem? Please describe.
Currently the order of Event Handlers for a Component cannot be changed by the user.
This forces users of Lowcoder to plan the order of Event handlers.
To work with debounce is possible - but not optimal.
Describe the solution you'd like
Lowcoder should make the Event handlers sortable like for example the columns in Data Tables
Describe alternatives you've considered
Users can currently use "Debounce" and give the order of execution of event handlers a timing.
Additional context
Add any other context or screenshots about the feature request here.
I place the custom component to the canvas.
The code in the settings is not working.
Only the following is shown:
The component found in the code snippet of the custom component will visit the specific address by default.
Components will access:
https://custom-component.lowcoder.dev/index.html
Implement the description in the following documentation on the custom component
https://github.com/lowcoder-org/lowcoder/blob/main/docs/build-apps/component-guides/custom-component.md
In the app editor, drag and drop custom components onto the canvas.
No response
No response
With a lot of API endpoints the Query Library gets out of control fast. I would like to be able to group queries that belong together in a folder.
As part of the project transfer, we need to replace all Openblocks references to Lowcoder equivalent.
Is your feature request related to a problem? Please describe.
I'm using Graphql for my queries. The response format looks like this: {data: product: {id: 1}}}
.
When I need to use this data I need to write queryProducts.data.data.product.id
.
I could solve this by using a transformProducts
transformfer that returns the nested data but that's annoying.
Describe the solution you'd like
In Retool I can attach a transformer right before the query output inside the query editor and I really like this solution as it is a regular need to add or change data of a query and it leaves the query list manageable.
Describe alternatives you've considered
Is your feature request related to a problem? Please describe.
Lowcoder Client calls often the /me API endpoint, which should deliver information about the logged in user. However, by the Domain Design and API binding, it gives rich content also about the workspaces/organizations in the response.
Describe the solution you'd like
Under the node "orgAndRoles" only Metadata of organization should get delivered. We need to check, if the other data is needed by the client.
when I make the selection, it does not display the data. When I take the string in management studio work this query
SELECT * FROM Users WHERE Id in ('8E965D1A-8EB8-43CA-B2C6-5E81946B4BC8', '14CC7614-FFFC-4DC0-9669-57E84BCBC522', 'CB32D41B-3FCC-4DD6-B546-B2477AC001C3', 'A5DCFAFD-3C 69-4CD8 -9840-E4C3D86D03F1', '8E3D5C2D-F5EB-4C54-88CE-64C98EBBB6D2', '4C7AF14B-83E5-4B72-B5C4-0C50743F6AF8', '3F534757-713E-4907-B09B-345D0 B4ED8DA');
7 rows from the table should be displayed
No response
No response
insert a service worker to lc to enable offline cache and add to home functions!
I set up the i18n locales file in the lowcoder-comps directory.
But it doesn't translate as it is set, it still keeps the original English content.
Translation according to i18n locales file.
lowcoder-comps i18n locales zh.ts file changed to the following
Next, open the designer, place a chart, and view the chart setup options.
export const zh = {
chart: {
delete: "删除",
data: "数据",
mode: "模式",
config: "配置",
UIMode: "UI模式",
chartType: "图表类型",
xAxis: "X轴",
chartSeries: "图表系列",
customSeries: "自定义系列",
add: "添加",
confirmDelete: "确认删除:",
seriesName: "系列名称",
dataColumns: "数据列",
title: "标题",
xAxisDirection: "X轴方向",
xAxisName: "X轴名称",
xAxisType: "X轴类型",
xAxisTypeTooltip: "默认情况下,根据X轴数据自动检测.有关类型描述,请参考:",
logBase: "对数底数",
yAxisName: "Y轴名称",
yAxisType: "Y轴类型",
yAxisDataFormat: "Y轴数据格式",
yAxisDataFormatTooltip: `值表示每个坐标的值.示例:'{{value * 100 + "%"}}'`,
basicBar: "基本柱状图",
stackedBar: "堆叠柱状图",
barType: "柱状图类型",
categoryAxis: "分类轴",
valueAxis: "值轴",
timeAxis: "时间轴",
logAxis: "对数轴",
auto: "自动",
legendPosition: "图例位置",
basicLine: "基本折线图",
stackedLine: "堆叠折线图",
areaLine: "区域折线图",
smooth: "平滑曲线",
lineType: "折线图类型",
basicPie: "基本饼图",
doughnutPie: "环形饼图",
rosePie: "玫瑰饼图",
pieType: "饼图类型",
spending: "支出",
budget: "预算",
bar: "柱状图",
line: "折线图",
scatter: "散点图",
pie: "饼图",
horizontal: "水平",
vertical: "垂直",
noData: "无数据",
unknown: "未知",
select: "选择",
unSelect: "取消选择",
echartsOptionLabel: "选项",
echartsOptionTooltip: "ECharts选项",
echartsOptionExamples: "ECharts示例",
selectDesc: "当用户选择图表中的部分数据时触发",
unselectDesc: "当用户取消选择图表中的部分数据时触发",
selectedPointsDesc: "已选中的数据点",
dataDesc: "当前图表使用的原始数据",
titleDesc: "当前图表标题",
scatterShape: "散点形状",
circle: "圆形",
rect: "矩形",
triangle: "三角形",
diamond: "菱形",
pin: "图钉",
arrow: "箭头",
pointColorLabel: "数据点颜色",
pointColorTooltip: `根据系列名称和当前数据点值设置数据点颜色,可选变量:seriesName、value.示例:'{{value < 25000 ? "red" : "green"}}'`,
},
imageEditor: {
defaultSrc: "",
save: "保存",
saveDesc: "保存图像",
src: "图像来源",
name: "图像名称",
buttonText: "按钮文本",
srcDesc: "图像来源",
nameDesc: "图像名称",
dataURIDesc: "图像数据URI",
dataDesc: "图像数据",
buttonTextDesc: "按钮文本",
},
calendar: {
events: "事件数据",
editable: "可编辑",
defaultDate: "默认日期",
defaultDateTooltip: "日历最初显示的日期",
defaultView: "默认视图",
defaultViewTooltip: "日历最初显示的视图",
showEventTime: "显示事件时间",
showEventTimeTooltip: "是否显示事件的时间文本",
showWeekends: "显示周末",
showAllDay: "显示全天",
showAllDayTooltip: "是否在周视图和日视图中显示全天时间段",
dayMaxEvents: "每日最多事件数",
dayMaxEventsTooltip: "在月视图中每天显示的事件最大数量,为0表示限制为单元格的高度",
eventMaxStack: "事件最大堆叠数",
eventMaxStackTooltip: "在周视图和日视图中水平堆叠的事件的最大数量,为0表示没有限制",
selectInterval: "日历上选择的时间间隔",
selectEvent: "已选事件",
changeSet: "拖动日历中更改的事件对象,键为eventId,值为事件对象",
headerBtnBackground: "按钮背景",
btnText: "按钮文本",
title: "标题",
selectBackground: "选择背景",
today: "今天",
month: "月",
week: "周",
day: "日",
list: "列表",
monday: "星期一",
tuesday: "星期二",
wednesday: "星期三",
thursday: "星期四",
friday: "星期五",
saturday: "星期六",
sunday: "星期日",
startWeek: "起始星期",
creatEvent: "创建事件",
editEvent: "编辑事件",
eventName: "事件名称",
eventColor: "事件颜色",
eventGroupId: "分组ID",
groupIdTooltip: "分组ID用于将不同的事件分组,同一组内的事件可以一起拖动和调整大小.",
more: "更多",
allDay: "全天",
eventNameRequire: "请输入事件名称",
eventId: "事件ID",
eventIdRequire: "请输入事件ID",
eventIdTooltip: "每个事件的唯一标识符",
eventIdExist: "ID已存在",
},
};
No response
No response
List what will be present in 2.1.0
Is your feature request related to a problem? Please describe.
Currently, only Background Color can be set for components. To create more expressive applications, it would be wishful to have the possibility to add Background Images to Components.
Describe the solution you'd like
Add a Property to set Background Images for Components, at least for the following Components:
To do so, add the Style CSS property: "background-image", "background-position", "background-repeat" and "background-size".
Allowed values for background-image should be:
Describe alternatives you've considered
Additional context
https://www.w3schools.com/cssref/pr_background-image.php
As this is a fork from Openblocks, most likely you guys did a find and replace on the documentation, because a lot of the links are broken. Eg. https://docs.lowcoder.cloud/lowcoder-documentation/setup-and-run/self-hosting has links to non-existent YAML files, the docker command does not work (uppercase in the repo name), plus you can't even pull the docker image without logging in.
We need to offer the ability to showcase good solutions.
Users should have the possibility to publish their solutions like in a CMS.
The feature described here is not available in the self-hosted version created using the Docker compose file.
There is no "Create workspace" button. Also an issue on Openblocks.
There is a "Create workspace" button.
Install Lowcoder, register an account, go to Workspaces.
No response
No response
Is your feature request related to a problem? Please describe.
I have a case where I don't need the user to download or filter the data. Moreover there's no need of pagination. I have disabled these features and the table footer is still there, as a white space without function.
Describe the solution you'd like
I'd like to be able to hide the table footer like I can with the header.
Is your feature request related to a problem? Please describe.
I need to write a lot of GraphQL queries. I'm used to do it in a GrqphiQL environment because it is much faster.
Describe the solution you'd like
I suggest integrating GraphiQL into the Lowcoder query editor. Please provide an easy way to update the schema, preferrably right inside the query editor because it's annyoing to have to reload the whole app everytime you have made changes to the database.
In the data sources, if you are using Open API, the openapi.json file is read once and never read again.
If you made change in the API, you have to recreate a data source to reload the openapi.json file (and therefore redo all your queries).
This is more of an oversight than a bug, but it is difficult to exploit in its current state.
I'd like to be able to update the lowcoder side (manually or automatically) when changes occur on the API side.
nothing in particular, it's just the way things work at the moment
Version: 1.1.8-4ca198b
No response
I used multi modules but sometimes I need editing function from module.
Solution is simply, add a link to module or add in right slide all properties of module.
Thank you
Is your feature request related to a problem? Please describe.
I have a table column containing numbers that I want to make editable. The column type selection is missing a number type. Therefore, I have no way of making sure that the user input will be a number. This is a very important functionality because having editable numbers in tables is very common.
Describe the solution you'd like
Describe alternatives you've considered
Imho there's no other way to solve this without a native implementation.
Is your feature request related to a problem? Please describe.
Unable to add an app to the home screen on apple device so it opens full screen and not within the window of a browser.
Describe the solution you'd like
To have <meta name=”apple-mobile-web-app-capable” content=”yes “> added to the metadata on all pages.
Describe alternatives you've considered
I have not tried this but was advised this metadata could be injected using java script on the page load.
Additional context
Given many users may want to use their apps in full screen on an apple device, it would be preferrable have this as a default setting on all apps.
Is your feature request related to a problem? Please describe.
When one create a Data Query in the Query Library, everyone can use this query later.
Describe the solution you'd like
Similar like for Datasources, a query in the Query Library must be subject to Access Control for Groups and / or individual Members.
Describe alternatives you've considered
Additional context
Is your feature request related to a problem? Please describe.
I'd like to use Lowcoder in a non-english speaking language environment. I'm using the table component. The table component holds unchangeable english terms like "Save changes". I have no time and expertise to add translations for this through a PR.
Especially for end users the whole user interface must be fully translated because language mix leads to distrust and considerably reduces the user experience quality.
Describe the solution you'd like
Having a possibility to easily suggest and maintain translations for the interface within the Lowcoder platform.
Describe alternatives you've considered
A documentation for non-coders on how to add and maintain translations with GitHub.
Is your feature request related to a problem? Please describe.
Each user group can have their own user homepage application. If there are multiple user groups, switching between multiple applications is possible.
If a default homepage application has already been set in the advanced settings, it will be displayed and switched together. If no default homepage application is set in the advanced settings by default, users under each user group can enter their own homepage application.
Describe the solution you'd like
Task
Is your feature request related to a problem? Please describe.
Many times on auto-executed queries (like on page load or when data changes) errors are generated becouse the query doesn't have sufficient data to run. This is the case when you load the page or set some fields to null. In that cases an error is generated. A solution could be control the queries execution by JS code inside Lowcoder but most of the time, that is exactly why we came here (to save time writing code).
Describe the solution you'd like
A box that sets what conditions need to be met for the query to execute.
Describe alternatives you've considered
Writing the conditions in a JS query before every other query.
Additional context
Add any other context or screenshots about the feature request here.
Original issue by @devendrakhatri: openblocks-dev/openblocks#297
For the use cases where we have multiple environments (DEV, UAT, PROD) and each environment has a dedicated database with exactly same schema.
Is it possible to build one dashboard with an option to switch between environments ?
With current datasource capability, looks like dashboard is tightly coupled with a specific database.
Can we think of passing datasource dynamically?
Probably we can call it "environment manager" which can manage all the base URLs, database,. etc. at single place and dashboard can switch to environments using dropdown list?
Environment | Service 1 | Database 1 | Database 2 |
---|---|---|---|
DEV | S1_DS_Dev | D1_DB_Dev | D2_DB_Dev |
UAT | SX_DS_Uat | D1_DB_Uat | D2_DB_Uat |
PROD | SY_DS_Prod | D1_DB_Prod | D2_DB_Prod |
Is your feature request related to a problem? Please describe.
When working with table showing multiple rows it takes time to scroll from top to bottom or from bottom to top to reach table navigation buttons to navigate to another page.
Describe the solution you'd like
In the table control can we add facility to show table navigation toolbar at both top and bottom instead of what is provides currently (top, bottom, none)?
I've tried two OpenAPI specs:
apiKey
with an Authorization
header)basic
)No matter the values I tried, I could never get the API's to properly authenticate. Whereas if I use the plain REST API and setup the authorization headers accordingly, the endpoint work fine.
The API's actually authenticate properly depending on their type.
Use the above OpenAPI specs, or find something else you as a developer have access to, and try to get the different types of authorization to work.
No response
I've tried to go through the code and see if I could spot something glaringly wrong. I couldn't, but I have a feeling the authorization headers aren't properly set on the fetch-request. That said, I will see if I can inspect it using the Inspector... Nope.
I follow the following documents to package and debug the backend JAVA api-service.
https://github.com/lowcoder-org/lowcoder/tree/main/server/api-service
However, the compilation has not been completed, and the log shows that it cannot continue after this part.
log Comment below to add
Compiled normally
Compile according to the following URL
https://github.com/lowcoder-org/lowcoder/tree/main/server/api-service
No response
No response
Is your feature request related to a problem? Please describe.
While trying to load 72k rows in Select control we observed that take very long time to load as all the values are fetched from database.
Describe the solution you'd like
In place of Select if a new component is created that will look like a simple Input Text control but it will be bound/mapped to data source and when user types something it will show a list of item which are filtered as per users entered text.
Describe alternatives you've considered
I think one way to achieve this would be to put a Textbox control and then when user types to run a query to fetch data based on user entered text and show the list of items from which user can select by clicking on and Item.
Additional context
Here is a sample screen shot of what we have been using in other low-code tools.
Can you develop an option to clear the date on calendar component on obile device?
Is your feature request related to a problem? Please describe.
Currently it is possible to export the JSON definition files for Apps, Data Queries etc. individually. However, it could be a lot of them over time in a Workspace. This makes it hard to move things to another Workspace or Lowcoder Installation.
Describe the solution you'd like
On an Export / Import Page it should be possible to see all resources of a Workspace and choose which of them to export in a single JSON Export file. Same time it must be possible to import selected Resources from such JSON Export file.
On step 3 of creating the app, a wrong URL is used for the user datastore. This seems a blatant find/replace of Openblocks:
https://63621db87521369cd06514c2.mockapi.io/api/lowcoder/users doesn't work, but https://63621db87521369cd06514c2.mockapi.io/api/openblocks/users does.
That said, regardless of a working URL, you are stuck on this step as the next button won't do anything. This was also an issue on Openblocks, by the way.
You can continue after step 3.
Spin up a new instance, register an account and follow the tour.
No response
No response
First of all thank you for continuing this awesome work! This is an great project and I'm really enjoying trying it out.
I have created a form with a selection dropdown, that triggers on Changed event to set a temporary state to the value uuid.v1().
As you can see in the image, uuid.v1() does run and the state is set correctly, which is great. However, it does not trigger when the selection is changed each time, or perhaps, it does run uuid.v1() but the value is the same somehow.
I opened up the browser console and running uuid.v1() repeatedly gave random uuids as expected
Thanks in advance!
I expected project_state.id
to be updated to a new random UUID each time the selection is changed for the dropdown
Ubuntu, just trying it out on https://app.lowcoder.cloud/
No response
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.