absmach / magistrala-ui Goto Github PK
View Code? Open in Web Editor NEWUI Repository for Magistrala IoT
UI Repository for Magistrala IoT
We should group the navbar items into related groups and also improve/streamline the naming/workflow of the UI. We can have something similar to what is being implemented in Losant
Modify chart modals to sync with the individual chart requirements
We need to be able to fetch data from Magistrala and be able to populate the charts with this data
No response
No response
Figure out the ideal location to implement the send message feature on the UI and implement it. Also, relocate the read message feature to be in the same location as the send message feature to make it easier to move to that page without having to copy the channel ID and thing Key.
No response
Currently, if my page request already has query parameters such as http://localhost:9095/messages?thingID=abxbx
, when I try to go to the next page on the table on that page, the current query parameters will be removed and replaced with the page
and limit
query parameters
I would like that instead of replacing the query parameters, I should just add on the query parameters present if any
No response
Currently, I cannot be able to enable any entities that have been disabled, since the UI does not provision for viewing these entities
We have filtering on the UI for filtering the data on the entities lists on tables to enable a user to see enabled
, disabled
, and all
entities. This will enable them to be able to see disabled entities and be able to enable the entity if they want to
No response
I'm trying to fetch Thing and Channel details.
I expect to be able to see a Thing and Channel page when I click on Thing or Channel in the table:
I am using entity fetch URLs in the form of http://localhost:9095/things/<thing_id>
.
I receive the error page (with insufficient error data):
Log in with the domain (an all the necessary steps before), create a Thing, and try to access it.
The latest build of both UI and core services as of the time of this issue.
Docker Compose version 2.23.3, Docker version 24.0.7, Brave browser 120.1.61.104.
No response
Since most transport errors are a result of user input errors, I would suggest that these errors be encoded as status codes, and handled on the client side. The client-side would use the javascript fetch
function to interrupt the default form submission.
Lets take createUser
as an example:
Create an HTTP request using the fetch
, then handle the response based on the various status codes you expect.
`func createUserEndpoint(svc ui.Service) endpoint.Endpoint {
return func(_ context.Context, request interface{}) (interface{}, error) {
req := request.(createUserReq)
if err := req.validate(); err != nil {
return nil, err
}
if err := svc.CreateUsers(req.token, req.User); err != nil {
return nil, err
}
return uiRes{
code: http.StatusCreated,
}, nil
}
}`
response.status===201
and return a banner
for successful user creation before reloading the page window.location.reload();
return nil, err
since we would have conflict error.encodeError
function, you encode the error with 409 (StatusConflict)response.status===409
and return a error message for conflict errortransport.go
and return statuscodes (e.g 400 (bad request) or 403(Forbiden))
, and include a custom header
in the response that conveys the particular validation error.No
Add Invitations page for user to be able to view and accept their invitation to domains.
We should also change the flow of the UI allowing a user to be able to view the dashboard without having to join an organization. They can then accept an invitation and join an organization or create an organization if they do not have any invitations. This means we should have an organizations management page on the dashboard
No response
no
We should move to using the default slog package in golang
No response
Add a canvas that supports a grid to place widgets on the dashboard.
No
we should provision for the super Admin to be able to edit the role of a user in the UI
No response
I'm listing Things by Channel (with Auth error).
I expect to receive the error page.
I received the correct result, but I also see the following warning:
2023/12/25 15:06:09 http: superfluous response.WriteHeader call from github.com/absmach/magistrala-ui/ui/api.encodeError (transport.go:2361)
Login in with the domain, create the channel, and click on the connect
button.
Latest images of Magistrala and UI, with Docker 24.0.7 and Compose version 2.23.3.
No response
Current breadcrumbs extend only to the second page. But we have more inner pages.
Improve the breadcrumbs to be able to accommodate more inner pages
No response
No response
No response
No
We would like to implement dashboards in our UI. This issue is for researching dashboard implementation, the technologies used, the most efficient approach, etc.
No response
I am trying to add a new Channel with a specified parent.
I expect the operation to succeed.
No visible results. The channel is created successfully (and correctly), but I can't see it on the UI.
Use the latest Magistrala and UI docker images, with Docker v24.0.0. Create a Channel and try to create another one with the previous Channel as a parent.
The latest (main branch) versions of MG and MG-UI running in Docker v24.0.0.
No response
No problem
We need to improve the UI/UX feel of our UI
No response
I'm trying to log in with the correct credentials.
I expect to seamlessly switch to the dashboard.
I log in successfully, but for a split second, I see a screen with the login form reset (as if I was redirected to the login form again) before moving to the dashboard.
Start the composition with all the latest images, register the user, and try to log in.
The latest build of both UI and core services as of the time of this issue.
Docker Compose version 2.23.3, Docker version 24.0.7, Brave browser 120.1.61.104.
No response
I should not be able to click on the update button for domain members who do not have edit permission over the domain.
I should not be able to add members to a domain without the necessary permission
The edit icon should be disabled
The add member icon should be disabled
The icons are clickable and when I try to perform the actions I get an error
No response
Magistrala UI
For this to be solved we need to be able to ListDomainPermissions a user has over a domain in Magistrala
The resizing action of the widget doesn't work well during the dashboard creation. This may result in widgets overlapping.
I expect as I resize a widget, the other adjacent widgets adjust their position with the widget resizing
The adjacent widgets are not readjusting their positions as shown above
Magistrala-UI dashboards branch
No response
NO
Group related features such as users and groups together for better UX
No response
I'm trying to create a Channel.
I expect to succeed once I enter valid data into the form.
Validation assumes the Name is empty even if it is not.
Docker V24.0.7, Compose 2.23.3, the latest version of core services, and the latest version of UI.
When using UI for a particular domain, in users
section I see super admins.
I expect to see only users who accepted invitations or who are explicitly added by super admins.
I see all the users who have access.
Run Magistrala's latest Docker compose, run UI, register user, login, create a domain, log in with domain, and go to users
screen.
Docker V24.0.7, Compose 2.23.3, the latest version of core services, and the latest version of UI.
Creating a channel with a parent channel when the logged-in user is not a super user
To be able to create the channel and view it. The channel has been created but I am not able to view it
Logs from the UI container
{"level":"warn","message":"Method create_channel took 21.193399ms to complete with error: unexpected end of JSON input : failed to create entity.","ts":"2023-12-18T09:32:16.815958391Z"}
{"level":"info","message":"Method ErrorPage took 3.013488ms to complete without errors.","ts":"2023-12-18T09:32:16.820148485Z"}
{"level":"info","message":"Method list_channels took 19.365223ms to complete without errors.","ts":"2023-12-18T09:32:16.850040967Z"}
{"level":"info","message":"Method get_entities took 3.068194ms to complete without errors.","ts":"2023-12-18T09:32:16.885943613Z"}
{"level":"info","message":"Method list_channels took 21.045913ms to complete without errors.","ts":"2023-12-18T09:32:31.849564301Z"}
{"level":"info","message":"Method get_entities took 3.849686ms to complete without errors.","ts":"2023-12-18T09:32:31.916560383Z"}
{"level":"warn","message":"Method create_channel took 4.537105ms to complete with error: entity already exists : failed to create entity.","ts":"2023-12-18T09:32:39.045759572Z"}
{"level":"warn","message":"Method create_channel took 12.582125ms to complete with error: unexpected end of JSON input : failed to create entity.","ts":"2023-12-18T09:32:45.037177828Z"}
{"level":"info","message":"Method ErrorPage took 5.676889ms to complete without errors.","ts":"2023-12-18T09:32:45.044085156Z"}
{"level":"info","message":"Method list_channels took 21.722683ms to complete without errors.","ts":"2023-12-18T09:32:45.07634593Z"}
{"level":"info","message":"Method get_entities took 3.028468ms to complete without errors.","ts":"2023-12-18T09:32:45.108747336Z"}
Logs from the things container
{"level":"warn","message":"Method create_group for new_channel with id using token eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJkb21haW4iOiIxOTRjZTMzMC0wNDI5LTQ3YWEtOTFiZC0xMDU0YThiM2VlYzgiLCJleHAiOjE3MDI4OTUyNzgsImlhdCI6MTcwMjg5MTY3OCwiaXNzIjoibWFnaXN0cmFsYS5hdXRoIiwic3ViIjoiMTk0Y2UzMzAtMDQyOS00N2FhLTkxYmQtMTA1NGE4YjNlZWM4X2I2NzgxN2FhLWI3ZGItNGY0My04ZDU5LThmNDliNzFjOGE4MyIsInR5cGUiOjAsInVzZXIiOiJiNjc4MTdhYS1iN2RiLTRmNDMtOGQ1OS04ZjQ5YjcxYzhhODMifQ.E_3afzddv2aafFdz4MP4YXc82Fu5XAF5xUY2OIibUPHDbC19pZfg05JZByS487acUDEX6_Ukyx91NMaa0SrJig took 20.492753ms to complete with error: rpc error: code = InvalidArgument desc = failed to add policies : malformed entity specification : unable to satisfy write precondition `operation:OPERATION_MUST_MATCH filter:{resource_type:\"group\" optional_resource_id:\"ad574820-f6d9-48e8-b947-a5af66691f40\" optional_relation:\"domain\" optional_subject_filter:{subject_type:\"domain\" optional_subject_id:\"194ce330-0429-47aa-91bd-1054a8b3eec8\"}}`.","ts":"2023-12-18T09:32:16.815592944Z"}
{"level":"info","message":"Method list_groups 1 groups using token eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJkb21haW4iOiIxOTRjZTMzMC0wNDI5LTQ3YWEtOTFiZC0xMDU0YThiM2VlYzgiLCJleHAiOjE3MDI4OTUyNzgsImlhdCI6MTcwMjg5MTY3OCwiaXNzIjoibWFnaXN0cmFsYS5hdXRoIiwic3ViIjoiMTk0Y2UzMzAtMDQyOS00N2FhLTkxYmQtMTA1NGE4YjNlZWM4X2I2NzgxN2FhLWI3ZGItNGY0My04ZDU5LThmNDliNzFjOGE4MyIsInR5cGUiOjAsInVzZXIiOiJiNjc4MTdhYS1iN2RiLTRmNDMtOGQ1OS04ZjQ5YjcxYzhhODMifQ.E_3afzddv2aafFdz4MP4YXc82Fu5XAF5xUY2OIibUPHDbC19pZfg05JZByS487acUDEX6_Ukyx91NMaa0SrJig took 15.895261ms to complete without errors.","ts":"2023-12-18T09:32:16.846798116Z"}
{"level":"info","message":"Method list_groups 1 groups using token eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJkb21haW4iOiIxOTRjZTMzMC0wNDI5LTQ3YWEtOTFiZC0xMDU0YThiM2VlYzgiLCJleHAiOjE3MDI4OTUyNzgsImlhdCI6MTcwMjg5MTY3OCwiaXNzIjoibWFnaXN0cmFsYS5hdXRoIiwic3ViIjoiMTk0Y2UzMzAtMDQyOS00N2FhLTkxYmQtMTA1NGE4YjNlZWM4X2I2NzgxN2FhLWI3ZGItNGY0My04ZDU5LThmNDliNzFjOGE4MyIsInR5cGUiOjAsInVzZXIiOiJiNjc4MTdhYS1iN2RiLTRmNDMtOGQ1OS04ZjQ5YjcxYzhhODMifQ.E_3afzddv2aafFdz4MP4YXc82Fu5XAF5xUY2OIibUPHDbC19pZfg05JZByS487acUDEX6_Ukyx91NMaa0SrJig took 2.72494ms to complete without errors.","ts":"2023-12-18T09:32:16.885771471Z"}
{"level":"warn","message":"failed to send Mainflux telemetry data with error: unsuccessful sending telemetry data with code 400 and error: <nil>","ts":"2023-12-18T09:32:18.712957299Z"}
{"level":"warn","message":"failed to send Mainflux telemetry data with error: unsuccessful sending telemetry data with code 400 and error: <nil>","ts":"2023-12-18T09:32:29.287097663Z"}
{"level":"info","message":"Method list_groups 1 groups using token eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJkb21haW4iOiIxOTRjZTMzMC0wNDI5LTQ3YWEtOTFiZC0xMDU0YThiM2VlYzgiLCJleHAiOjE3MDI4OTUyNzgsImlhdCI6MTcwMjg5MTY3OCwiaXNzIjoibWFnaXN0cmFsYS5hdXRoIiwic3ViIjoiMTk0Y2UzMzAtMDQyOS00N2FhLTkxYmQtMTA1NGE4YjNlZWM4X2I2NzgxN2FhLWI3ZGItNGY0My04ZDU5LThmNDliNzFjOGE4MyIsInR5cGUiOjAsInVzZXIiOiJiNjc4MTdhYS1iN2RiLTRmNDMtOGQ1OS04ZjQ5YjcxYzhhODMifQ.E_3afzddv2aafFdz4MP4YXc82Fu5XAF5xUY2OIibUPHDbC19pZfg05JZByS487acUDEX6_Ukyx91NMaa0SrJig took 4.293854ms to complete without errors.","ts":"2023-12-18T09:32:31.83299253Z"}
{"level":"info","message":"Method list_groups 1 groups using token eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJkb21haW4iOiIxOTRjZTMzMC0wNDI5LTQ3YWEtOTFiZC0xMDU0YThiM2VlYzgiLCJleHAiOjE3MDI4OTUyNzgsImlhdCI6MTcwMjg5MTY3OCwiaXNzIjoibWFnaXN0cmFsYS5hdXRoIiwic3ViIjoiMTk0Y2UzMzAtMDQyOS00N2FhLTkxYmQtMTA1NGE4YjNlZWM4X2I2NzgxN2FhLWI3ZGItNGY0My04ZDU5LThmNDliNzFjOGE4MyIsInR5cGUiOjAsInVzZXIiOiJiNjc4MTdhYS1iN2RiLTRmNDMtOGQ1OS04ZjQ5YjcxYzhhODMifQ.E_3afzddv2aafFdz4MP4YXc82Fu5XAF5xUY2OIibUPHDbC19pZfg05JZByS487acUDEX6_Ukyx91NMaa0SrJig took 3.41787ms to complete without errors.","ts":"2023-12-18T09:32:31.916342772Z"}
{"level":"warn","message":"Method create_group for new_channel with id using token eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJkb21haW4iOiIxOTRjZTMzMC0wNDI5LTQ3YWEtOTFiZC0xMDU0YThiM2VlYzgiLCJleHAiOjE3MDI4OTUyNzgsImlhdCI6MTcwMjg5MTY3OCwiaXNzIjoibWFnaXN0cmFsYS5hdXRoIiwic3ViIjoiMTk0Y2UzMzAtMDQyOS00N2FhLTkxYmQtMTA1NGE4YjNlZWM4X2I2NzgxN2FhLWI3ZGItNGY0My04ZDU5LThmNDliNzFjOGE4MyIsInR5cGUiOjAsInVzZXIiOiJiNjc4MTdhYS1iN2RiLTRmNDMtOGQ1OS04ZjQ5YjcxYzhhODMifQ.E_3afzddv2aafFdz4MP4YXc82Fu5XAF5xUY2OIibUPHDbC19pZfg05JZByS487acUDEX6_Ukyx91NMaa0SrJig took 4.025736ms to complete with error: entity already exists : ERROR: duplicate key value violates unique constraint \"groups_owner_id_name_key\" (SQLSTATE 23505).","ts":"2023-12-18T09:32:39.045549887Z"}
{"level":"warn","message":"failed to send Mainflux telemetry data with error: unsuccessful sending telemetry data with code 400 and error: <nil>","ts":"2023-12-18T09:32:39.868427462Z"}
{"level":"warn","message":"Method create_group for new_channel with id using token eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJkb21haW4iOiIxOTRjZTMzMC0wNDI5LTQ3YWEtOTFiZC0xMDU0YThiM2VlYzgiLCJleHAiOjE3MDI4OTUyNzgsImlhdCI6MTcwMjg5MTY3OCwiaXNzIjoibWFnaXN0cmFsYS5hdXRoIiwic3ViIjoiMTk0Y2UzMzAtMDQyOS00N2FhLTkxYmQtMTA1NGE4YjNlZWM4X2I2NzgxN2FhLWI3ZGItNGY0My04ZDU5LThmNDliNzFjOGE4MyIsInR5cGUiOjAsInVzZXIiOiJiNjc4MTdhYS1iN2RiLTRmNDMtOGQ1OS04ZjQ5YjcxYzhhODMifQ.E_3afzddv2aafFdz4MP4YXc82Fu5XAF5xUY2OIibUPHDbC19pZfg05JZByS487acUDEX6_Ukyx91NMaa0SrJig took 12.189375ms to complete with error: rpc error: code = InvalidArgument desc = failed to add policies : malformed entity specification : unable to satisfy write precondition `operation:OPERATION_MUST_MATCH filter:{resource_type:\"group\" optional_resource_id:\"733a33c5-c673-4a81-bf7b-7d8194c953d7\" optional_relation:\"domain\" optional_subject_filter:{subject_type:\"domain\" optional_subject_id:\"194ce330-0429-47aa-91bd-1054a8b3eec8\"}}`.","ts":"2023-12-18T09:32:45.036987309Z"}
{"level":"info","message":"Method list_groups 1 groups using token eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJkb21haW4iOiIxOTRjZTMzMC0wNDI5LTQ3YWEtOTFiZC0xMDU0YThiM2VlYzgiLCJleHAiOjE3MDI4OTUyNzgsImlhdCI6MTcwMjg5MTY3OCwiaXNzIjoibWFnaXN0cmFsYS5hdXRoIiwic3ViIjoiMTk0Y2UzMzAtMDQyOS00N2FhLTkxYmQtMTA1NGE4YjNlZWM4X2I2NzgxN2FhLWI3ZGItNGY0My04ZDU5LThmNDliNzFjOGE4MyIsInR5cGUiOjAsInVzZXIiOiJiNjc4MTdhYS1iN2RiLTRmNDMtOGQ1OS04ZjQ5YjcxYzhhODMifQ.E_3afzddv2aafFdz4MP4YXc82Fu5XAF5xUY2OIibUPHDbC19pZfg05JZByS487acUDEX6_Ukyx91NMaa0SrJig took 17.892665ms to complete without errors.","ts":"2023-12-18T09:32:45.072728985Z"}
{"level":"info","message":"Method list_groups 1 groups using token eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJkb21haW4iOiIxOTRjZTMzMC0wNDI5LTQ3YWEtOTFiZC0xMDU0YThiM2VlYzgiLCJleHAiOjE3MDI4OTUyNzgsImlhdCI6MTcwMjg5MTY3OCwiaXNzIjoibWFnaXN0cmFsYS5hdXRoIiwic3ViIjoiMTk0Y2UzMzAtMDQyOS00N2FhLTkxYmQtMTA1NGE4YjNlZWM4X2I2NzgxN2FhLWI3ZGItNGY0My04ZDU5LThmNDliNzFjOGE4MyIsInR5cGUiOjAsInVzZXIiOiJiNjc4MTdhYS1iN2RiLTRmNDMtOGQ1OS04ZjQ5YjcxYzhhODMifQ.E_3afzddv2aafFdz4MP4YXc82Fu5XAF5xUY2OIibUPHDbC19pZfg05JZByS487acUDEX6_Ukyx91NMaa0SrJig took 2.681076ms to complete without errors.","ts":"2023-12-18T09:32:45.108552549Z"}
Git commit - b40e562
Docker Compose version 2.23.3
Docker version
Client:
Version: 24.0.7
API version: 1.43
OS/Arch: linux/amd64Server:
Engine:
Version: 24.0.7
API version: 1.43 (minimum version 1.12)
For this issue, when I log in as an admin to the same domain where the channels were created, I can see the channels.
View a channel that has a parentID
.
To be able to view the channel and possibly the parentID
{"level":"info","message":"Method list_channels took 9.069263ms to complete without errors.","ts":"2023-12-18T09:39:44.955237986Z"}
{"level":"info","message":"Method get_entities took 5.670268ms to complete without errors.","ts":"2023-12-18T09:39:45.02150105Z"}
{"level":"warn","message":"Method view_channel for channel 5a281255-536d-4263-bfb1-59882d1aae6c took 2.443387ms to complete with error: unexpected end of JSON input : failed to retrieve entity.","ts":"2023-12-18T09:39:46.239980389Z"}
{"level":"info","message":"Method ErrorPage took 4.183833ms to complete without errors.","ts":"2023-12-18T09:39:46.250487103Z"}
Git commit - b40e562
Docker Compose version 2.23.3
Docker version
Client:
Version: 24.0.7
API version: 1.43
OS/Arch: linux/amd64Server:
Engine:
Version: 24.0.7
API version: 1.43 (minimum version 1.12)
No response
I'm trying to see a Thing.
I expect to see a Thing page without unnecessary vertical scroll.
The thing table shows a scroll bar where it is not needed.
Register, login, create a domain, log in with the domain, create a thing, and go to that thing page.
Latest images of Magistrala and UI, Docker 24.0.7, Compose 2.23.3.
I'm trying to access the login page while logged in.
I expect to be redirected to the dashboard.
If I go directly to the login page - I get an error page - see additional information.
If I go back in history, I access the login form.
Register, login, try to access login again 1) by typing the address in the address bar or 2) going back in hisotry.
The latest build of both UI and core services as of the time of this issue.
Docker Compose version 2.23.3, Docker version 24.0.7, Brave browser 120.1.61.104.
No
Replace Organization with Domain for Magistrala
No response
we currently don't have an entity event page.
We need to design and implement an events page for an entity, where an admin can be able to view all the events that have been done on an entity, e.g. who has updated the entity, when was it updated, etc.
No response
No
Update login page javascript to use the common javascript files
No response
No
Addition of breadcrumbs to the UI pages for easier management of pages and make it easier for use to go back to previous pages
No response
No response
Update the script we use to reduce repetition. Some scripts are reused in a number of html files.
No response
No response
Add tests to the UI code
No response
View the tables for pages such as thing-channels, thing-users, e.t.c
The metadata field should be updated to the latest changes. They should look as below:
The metadata field of the inner tables was not updated, it is still as it was before.
Magistrala UI
No response
Download csv file samples for users, things, channels and groups bulk creation
Redirect to Magistrala Repo
Redirects to Mainflux Ultraviolet repo
No response
Magistrala UI
No response
List entry on update is still as a slice. It should be abstracted as in #32
Abstract underlying data structure on user entry for update method
No response
We should provision for custom widget development to allow users to create their own custom widgets similar to the one on thingsboard https://thingsboard.io/docs/user-guide/contribution/widgets-development/
no
Update metadata formatting on the UI especially where we edit the metadata for better UX experience
No response
I cannot be able to remove a member from a domain once they are added to the domain
A domain admin should be able to remove members from a domain. Provision for this allows only the domain admin to be able to remove a user from a domain.
No response
When we resize the widget the chart size does not change
When a user resizes a widget they need to be able to resize the chart inside the widget as well
No response
No
We should provision for streaming of messages as they are sent on a channel using WebSockets
No response
No response
We add expiration time to tokens as we add them to browser cookies
No response
I'm not able to see the parentID
of groups I have created
To be able to view the parentID of a group
curl -iX GET -H "Authorization: Bearer $USER_TOKEN" "http://localhost:9002/groups/$GROUP_ID"
HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 18 Dec 2023 09:44:02 GMT
Content-Length: 257
{"id":"36c1c3ac-9828-45b2-9887-391698447785","owner_id":"194ce330-0429-47aa-91bd-1054a8b3eec8","parent_id":"cd495d8d-2e9d-4dc1-87a5-33e43e0ed86b","name":"G3","created_at":"2023-12-18T09:30:37.639803Z","updated_at":"0001-01-01T00:00:00Z","status":"enabled"}
The bootstrap service has not been updated in a while.
Carry out testing of the bootstrap service on the UI to ensure it is running correctly and update any outdated features. Also, fix any bugs that may be encountered during testing.
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.