ash-project / ash_hq Goto Github PK
View Code? Open in Web Editor NEWThe Ash Framework homepage and documentation site.
License: MIT License
The Ash Framework homepage and documentation site.
License: MIT License
At the moment only Ash is enabled by default, but in the majority of cases, new users will be using all three of the libraries and may get tripped up on how to enable the others.
Have seen this internally even after the addition of the Big Blue Box - user asking why the documentation for AshPhoenix is missing on AshHQ, not realizing it needed to be enabled first.
Brief Description
This is a bit of a weird one - I noticed that the background content of the page scrolls when search results are returned.
Steps to reproduce the bug
changeset
The video perhaps sums it up better!
Context
When writing extensions, knowing what other transformers might be running is important information. In each extension, we should automatically document each transformer.
Brief Description
When adding the necessary classes to make the text overflow “…” work, it makes the list bullets (both numbers and alphas) disappear in Safari only, both web and mobile.
Steps to reproduce the bug
Visit any page with a table of contents, eg. https://ash-hq.org/docs/guides/ash/latest/tutorials/get-started
In Firefox/Chrome the list markers appear, but in Safari they do not.
Context
I've laid the groundwork for the beginning of this. When highlighting code, we parse inline code blocks and annotate them with things like data-module
and data-function
depending. Things remaining:
This may require additions to the work I've done so far.
Perhaps an issue is not the best place to gather these, so please feel free to move elsewhere. I wanted to compile these somewhere so that they can be addressed one way or the other.
Observing the site, I came up with the following list of small items that could possibly be tweaked:
Show where you found the issue
I have followed the Get Started guide to build the Helpdesk app and then followed the Whats next section where we have a link to learn how to use Code interfaces.
While I perfectly understood how to use the define_for
, because it builds on top of the Helpdesk app, I wasn't able to grasp how to use the define_interface
, because the example for it doesn't build on top of the Helpdesk app.
Share the problematic documentation
define_for and define_interface
Notice how we included a specific Api module using define_for above. Without this, no functions will be defined in the resource. This is because you might want to define the interface for multiple resources in a single module. While we encourage the use of define_for Api , it is not the only way to do it. You could also do something like this:
defmodule MyApp.MyApi.Interface do require Ash.CodeInterface Ash.CodeInterface.define_interface(MyApp.MyApi, MyApp.Resource1) Ash.CodeInterface.define_interface(MyApp.MyApi, MyApp.Resource2) end And then call functions on MyApp.MyApi.Interface instead.
`
Additional context
It would be awesome if all the docs code examples would build on top of the HelpDesk app.
Show where you found the issue
Get started with Postgres isn't styled as a title.
Share the problematic documentation
Additional context
If the docs are in Postgres, are chumps like me able to fix them without raising an issue for someone with access to do it?
Track recently viewed documentation for each user, and surface it in the search bar.
Since users can log in, we can support them bookmarking documentation and having a bookmarks page that shows all their bookmarked documentation.
When viewing a guide, we should add a link to modify the current guide that links to the source file for that guide. We should know where this is because we have the library version, and currently they are all at the same derived github path (inside the ash-project, the repo is the same as the library), and are in the /documentation/
directory.
Show where you found the issue
Bottom of page: https://ash-hq.org/docs/guides/ash/2.4.2/topics/multitenancy
In the sentence: "For AshPostgres context multitenancy, which uses postgres schemas, see the guide"
The word guide links to guide
Share the problematic documentation
This 404's, PAGE NOT FOUND in Hexdocs.pm
Additional context
Should probably link to https://hexdocs.pm/ash_postgres/schema-based-multitenancy.html
Although this does not exactly describe "context multitenancy"
Currently, your first visit to Ash HQ, you can search the documentation, but the search defaults to 'None' for the project versions:
It might make sense to default Ash to the current version?
Note, you can't replicate this with a private window (something must be shared between a private window and a previous non private session)
Brief Description
Using OSX and Firefox - it doesn't happen in Safari or Chrome.
Scrolling past a certain point on any page seems to give a weird jiggling effect every time an anchor is passed - like its trying to snap to the anchor or something?
eg. on https://ash-hq.org/docs/module/ash/2.4.0/ash-type
Brief Description
Navigating from https://ash-hq.org/docs/guides/ash_postgres/1.1.1/topics/polymorphic_resources.md to https://ash-hq.org/docs/guides/ash_postgres/1.1.1/topics/migrations_and_tasks.md via the tree-view results in the "Migrations" heading appears both as a <h1>
and as a <h2>
(see image).
Steps to reproduce the bug
On MacOS Safari visit https://ash-hq.org/docs/guides/ash_postgres/1.1.1/topics/polymorphic_resources.md
Click the Guides -> Topics -> Ash Postgres -> Migrations and Tasks link in the tree view
Notice the header is incorrect.
Refresh the page and it displays correctly.
Context
Perhaps it is related to both pages having a DOM element with id="migrations" ?
When going to ash-hq via a link with a fragment, I've noticed the top nav bar (with the 'search documentation' etc) disappears. It looks like it appears on the disconnected mount, then disappears on the connected mount?
Tested on Chrome (on linux):
In hexdocs, there is a little yellow warning next to deprecated functions, but not in ash_hq
Currently the search mechanism for documentation doesn't sort results based on how specific a match is between the search term and the result.
This can be replicated by navigating to https://ash-hq.org/ and searching for flow
. The first results will contain the search phrase, but the main page for Ash.Flow
requires some scrolling to find. A similar situation also happens if one searches for ash.flow
, as the other modules beginning with ash.flow
will be placed in the results before the exact match of ash.flow
is.
From a user's point of view this seems bothersome, as when I'm searching specifically for Ash.Flow, I would expect the exact match of Ash.Flow be the top result.
I don't know what the best approach would be to defining a more desirable sorting mechanism, and perhaps building various hand-crafted rules isn't the way to go here.
Just for the sake of rubberducking though, it looks like the hierarchy itself might be one place to look into (if we have that information available to us when ordering the results): perhaps if we have multiple matches, we could give more weight to results that are higher in the hierarchy (aka. closer to the top)?
Or perhaps something akin String.jaro_distance/2
could be used to rank the match-in-module-name ranks?
eg. when viewing https://ash-hq.org/docs/guides/ash/2.5.12/tutorials/get-started
ideally we should go to the same page in that version of the docs, ie. if we select 2.5.16 then we should get redirected to https://ash-hq.org/docs/guides/ash/2.5.16/tutorials/get-started
Leads to a weird inconsistency where the catalogue says newly-selected version is active, but closing the catalogue shows a version pill of 2.5.12 in the sidebar
Cannot understate what a minor nitpick this is.
Putting it down here so its not missed.
This issue is what it says in the title.
Can either add an explicit validator to the section, or make a new section explaining the validator separately.
Found here: https://ash-hq.org/docs/guides/ash/2.5.0-rc.6/tutorials/get-started#updates-and-validations
Brief Description
Code snippets don't have syntax highlighting.
As far as I can tell, this isn't an issue with a specific package, it occurs across all related Ash packages. There appears to be relevant classes associated with each <code>
element e.g. bash
or elixir
but there is no styling applied, just white text on a sark grey background.
Steps to reproduce the bug
Context
Here's an example of a code block taken from here
Show where you found the issue
https://ash-hq.org/docs/guides/ash/latest/tutorials/get-started
as an example. It contains no content.
Additional context
All pages seem to reflect this issue.
It appears that we hit a memory usage limit on ash_hq in fly.io, almost certainly because of an import running. We upgraded to their suggested amount of memory in response. We got a nice little email from fly with the exact command to run to increase the memory to their recommended value. Very convenient. This issue serves as documentation for that event.
Show where you found the issue
https://ash-hq.org/docs/guides/ash/2.4.0/topics/actions.md#create-update-destroy-actions
Share the problematic documentation
I feel like soft?
and base_filter
are supposed to link to something or be formatted in some particular way instead of displayed like this?
In the first paragraph here: https://www.ash-hq.org/docs/guides/ash/latest/topics/pagination#pagination
The [actions > read > prepare](https://www.ash-hq.org/docs/dsl/ash/latest/actions/read/prepare)
link results in an "Internal Server Error" page.
Also as a minor note, it would be really nice to include an example of actually incorporating pagination into an action on this page.
At the moment, the docker container raises an erlang runtime error for some reason when we try to run the importer. I've only gotten it to work on my local machine, and eventually we want it to work on the deployed container.
Right now you can only add or remove packages, but the end goal is being able to select specific versions of packages, as well as browse the list to see an explanation of what each package is.
Brief Description
Before the sidebar rewrite, I think this worked correctly - the nav would change and any necessary nodes would be expanded to show the node for the new page.
Steps to reproduce the bug
changeset
)Seeing an error reported in iex when running locally. This is a fresh local install.
[error] Invalid link %Protocol.UndefinedError{description: "", protocol: String.Chars, value: #AshHq.Docs.LibraryVersion<meta: #Ecto.Schema.Metadata<:loaded, "library_versions">, order: nil, aggregates: %{}, calculations: %{}, extensions: [#AshHq.Docs.Extension<meta: #Ecto.Schema.Metadata<:loaded, "extensions">, order: nil, aggregates: %{}, calculations: %{}, default_for_target: true, doc: nil, doc_html: nil, dsls: [#AshHq.Docs.Dsl<version_name: "2.0.0-rc.3", search_headline: #Ash.NotLoaded<:calculation>, args: ["validation"], links: %{"guides" => ["ash:guide:Actions"], "modules" => ["ash:module:Ash.Resource.Change"]}, examples: ["validate {Mod, [foo: :bar]}", "validate at_least_one_of_present([:first_name, :last_name])"], extension_id: "626567d7-7d50-42c2-b9c3-f79534551179", id: "cf007ffb-9466-4d38-b3cc-805c474e2ca1", extension_name: "Resource", matches: #Ash.NotLoaded<:calculation>, dsl: #Ash.NotLoaded<:relationship>, aggregates: %{}, doc_html: nil, name: "validate", library_id: "6b5d023e-48b1-43e3-ae7c-efb82eb59a84", extension_order: 0, options: #Ash.NotLoaded<:relationship>, library_version_id: "616bc185-3c4d-4585-8d9d-21d0d7c11230", match_rank: #Ash.NotLoaded<:calculation>, dsls: #Ash.NotLoaded<:relationship>, type: :entity, order: nil, calculations: %{}, sanitized_path: "validations/validate", name_matches: #Ash.NotLoaded<:calculation>, library_version: #Ash.NotLoaded<:relationship>, meta: #Ecto.Schema.Metadata<:loaded, "dsls">, doc: nil, html_for: #Ash.NotLoaded<:calculation>, dsl_id: nil, order: 0, library_name: "ash", extension: #Ash.NotLoaded<:relationship>, ...>, #AshHq.Docs.Dsl<version_name: "2.0.0-rc.3", search_headline: #Ash.NotLoaded<:calculation>, args: ["preparation"], links: %{"guides" => ["ash:guide:Actions"]}, examples: ["prepare build(sort: [:foo, :bar])"], extension_id: "626567d7-7d50-42c2-b9c3-f79534551179", id: "f3988e6d-5f7a-44cf-9297-853da8937686", extension_name: "Resource", matches: #Ash.NotLoaded<:calculation>, dsl: #Ash.NotLoaded<:relationship>, aggregates: %{}, doc_html: nil, name: "prepare", library_id: "6b5d023e-48b1-43e3-ae7c-efb82eb59a84", extension_order: 0, options: #Ash.NotLoaded<:relationship>, library_version_id: "616bc185-3c4d-4585-8d9d-21d0d7c11230", match_rank: #Ash.NotLoaded<:calculation>, dsls: #Ash.NotLoaded<:relationship>, type: :entity, order: nil, calculations: %{}, sanitized_path: "preparations/prepare", name_matches: #Ash.NotLoaded<:calculation>, library_version: #Ash.NotLoaded<:relationship>, meta: #Ecto.Schema.Metadata<:loaded, "dsls">, doc: nil, html_for: #Ash.NotLoaded<:calculation>, dsl_id: nil, order: 0, library_name: "ash", ...>, #AshHq.Docs.Dsl<version_name: "2.0.0-rc.3", search_headline: #Ash.NotLoaded<:calculation>, args: ["change"], links: %{"guides" => ["ash:guide:Actions"], "modules" => ["ash:module:Ash.Resource.Change"]}, examples: ["change relate_actor(:reporter)", "change {MyCustomChange, :foo}"], extension_id: "626567d7-7d50-42c2-b9c3-f79534551179", id: "3309fd83-931f-4939-9e51-be618af8b117", extension_name: "Resource", matches: #Ash.NotLoaded<:calculation>, dsl: #Ash.NotLoaded<:relationship>, aggregates: %{}, doc_html: nil, name: "change", library_id: "6b5d023e-48b1-43e3-ae7c-efb82eb59a84", extension_order: 0, options: #Ash.NotLoaded<:relationship>, library_version_id: "616bc185-3c4d-4585-8d9d-21d0d7c11230", match_rank: #Ash.NotLoaded<:calculation>, dsls: #Ash.NotLoaded<:relationship>, type: :entity, order: nil, calculations: %{}, sanitized_path: "changes/change", name_matches: #Ash.NotLoaded<:calculation>, library_version: #Ash.NotLoaded<:relationship>, meta: #Ecto.Schema.Metadata<:loaded, "dsls">, doc: nil, html_for: #Ash.NotLoaded<:calculation>, dsl_id: nil, order: 0, ...>, #AshHq.Docs.Dsl<version_name: "2.0.0-rc.3", search_headline: #Ash.NotLoaded<:calculation>, args: ["name", "keys"], links: %{"guides" => ["ash:guide:Identities"]}, examples: ["identity :name, [:name]", "identity :full_name, [:first_name, :last_name]"], extension_id: "626567d7-7d50-42c2-b9c3-f79534551179", id: "8302ca73-2828-4613-8b1d-c0709fe9ec2c", extension_name: "Resource", matches: #Ash.NotLoaded<:calculation>, dsl: #Ash.NotLoaded<:relationship>, aggregates: %{}, doc_html: nil, name: "identity", library_id: "6b5d023e-48b1-43e3-ae7c-efb82eb59a84", extension_order: 0, options: #Ash.NotLoaded<:relationship>, library_version_id: "616bc185-3c4d-4585-8d9d-21d0d7c11230", match_rank: #Ash.NotLoaded<:calculation>, dsls: #Ash.NotLoaded<:relationship>, type: :entity, order: nil, calculations: %{}, sanitized_path: "identities/identity", name_matches: #Ash.NotLoaded<:calculation>, library_version: #Ash.NotLoaded<:relationship>, meta: #Ecto.Schema.Metadata<:loaded, "dsls">, doc: nil, html_for: #Ash.NotLoaded<:calculation>, dsl_id: nil, ...>, #AshHq.Docs.Dsl<version_name: "2.0.0-rc.3", search_headline: #Ash.NotLoaded<:calculation>, args: ["name"], links: %{"guides" => ["ash:guide:Code Interface"]}, examples: ["define :get_user_by_id, action: :get_by_id, args: [:id], get?: true"], extension_id: "626567d7-7d50-42c2-b9c3-f79534551179", id: "b3cc6c2f-5028-42fd-b9ae-9455c54d9f9f", extension_name: "Resource", matches: #Ash.NotLoaded<:calculation>, dsl: #Ash.NotLoaded<:relationship>, aggregates: %{}, doc_html: nil, name: "define", library_id: "6b5d023e-48b1-43e3-ae7c-efb82eb59a84", extension_order: 0, options: #Ash.NotLoaded<:relationship>, library_version_id: "616bc185-3c4d-4585-8d9d-21d0d7c11230", match_rank: #Ash.NotLoaded<:calculation>, dsls: #Ash.NotLoaded<:relationship>, type: :entity, order: nil, calculations: %{}, sanitized_path: "code_interface/define", name_matches: #Ash.NotLoaded<:calculation>, library_version: #Ash.NotLoaded<:relationship>, meta: #Ecto.Schema.Metadata<:loaded, "dsls">, doc: nil, html_for: #Ash.NotLoaded<:calculation>, ...>, #AshHq.Docs.Dsl<version_name: "2.0.0-rc.3", search_headline: #Ash.NotLoaded<:calculation>, args: ["change"], links: %{"guides" => ["ash:guide:Actions"], "modules" => ["ash:module:Ash.Resource.Change"]}, examples: ["change relate_actor(:reporter)", "change {MyCustomChange, :foo}"], extension_id: "626567d7-7d50-42c2-b9c3-f79534551179", id: "e99c7926-3e8d-49c8-a598-7c016e2e2bef", extension_name: "Resource", matches: #Ash.NotLoaded<:calculation>, dsl: #Ash.NotLoaded<:relationship>, aggregates: %{}, doc_html: nil, name: "change", library_id: "6b5d023e-48b1-43e3-ae7c-efb82eb59a84", extension_order: 0, options: #Ash.NotLoaded<:relationship>, library_version_id: "616bc185-3c4d-4585-8d9d-21d0d7c11230", match_rank: #Ash.NotLoaded<:calculation>, dsls: #Ash.NotLoaded<:relationship>, type: :entity, order: nil, calculations: %{}, sanitized_path: "actions/destroy/change", name_matches: #Ash.NotLoaded<:calculation>, library_version: #Ash.NotLoaded<:relationship>, meta: #Ecto.Schema.Metadata<:loaded, "dsls">, doc: nil, ...>, #AshHq.Docs.Dsl<version_name: "2.0.0-rc.3", search_headline: #Ash.NotLoaded<:calculation>, args: ["change"], links: %{"guides" => ["ash:guide:Actions"], "modules" => ["ash:module:Ash.Resource.Change"]}, examples: ["change relate_actor(:reporter)", "change {MyCustomChange, :foo}"], extension_id: "626567d7-7d50-42c2-b9c3-f79534551179", id: "6741e884-949e-457f-8585-87ffcf9ccb2c", extension_name: "Resource", matches: #Ash.NotLoaded<:calculation>, dsl: #Ash.NotLoaded<:relationship>, aggregates: %{}, doc_html: nil, name: "change", library_id: "6b5d023e-48b1-43e3-ae7c-efb82eb59a84", extension_order: 0, options: #Ash.NotLoaded<:relationship>, library_version_id: "616bc185-3c4d-4585-8d9d-21d0d7c11230", match_rank: #Ash.NotLoaded<:calculation>, dsls: #Ash.NotLoaded<:relationship>, type: :entity, order: nil, calculations: %{}, sanitized_path: "actions/update/change", name_matches: #Ash.NotLoaded<:calculation>, library_version: #Ash.NotLoaded<:relationship>, meta: #Ecto.Schema.Metadata<:loaded, "dsls">, ...>, #AshHq.Docs.Dsl<version_name: "2.0.0-rc.3", search_headline: #Ash.NotLoaded<:calculation>, args: ["name", "type"], links: %{}, examples: ["argument :password_confirmation, :string"], extension_id: "626567d7-7d50-4 (truncated)
Need to improve the general behavior of the sidebar, and make all expansion/selection state client-side.
We should remove our hand rolled authentication layer and use the new AshAuthentication.
Brief Description
Viewing Docs at ash-hq.org
Steps to reproduce the bug
Activate Dark Mode in MacOS or Linux
Navigate to https://ash-hq.org/docs/guides/ash_postgres/latest/ashpostgres
The blue topbar runs, but no content is displayed.
Specifically tested on: Linux/Firefox & MacOS /Safari dark modes.
Context
Content failing to display in dark mode in FF Linux
Note this does not occur in light mode (could only test on Chrome/Linux)
I guess the first question is, can we replicate in Google Chrome's dark mode on MacOS?
Show where you found the issue
The reference section on ash hq doesn't display the default values for options. For instance:
https://ash-hq.org/docs/dsl/ash/2.4.16/resource/relationships/belongs_to#allow_nil-:
The default values are displayed on hexdocs:
I feel like we need another column in the table for the default value (rather than embedding the default value into the description)
Brief Description
Just came across this - makes it really hard to use consistently for multiple packages! I always want to have Ash and AshPhoenix selected as active packages.
Steps to reproduce the bug
changeset
Currently, when running locally, navigating to the Get Started guide via either the CTA button on the home page or the book icon in the top nav throws the following error:
nil.version()
(ash_hq 0.1.0) lib/ash_hq_web/pages/docs.ex:453: AshHqWeb.Pages.Docs.render_mix_dep/3
(ash_hq 0.1.0) lib/ash_hq_web/pages/docs.ex:421: anonymous fn/2 in AshHqWeb.Pages.Docs.render_mix_deps/2
(elixir 1.13.4) lib/regex.ex:739: Regex.apply_list/5
(elixir 1.13.4) lib/regex.ex:734: Regex.apply_list/5
(elixir 1.13.4) lib/regex.ex:669: Regex.replace/4
(ash_hq 0.1.0) lib/ash_hq_web/pages/docs.ex:122: anonymous fn/2 in AshHqWeb.Pages.Docs."render (overridable 1)"/1
(phoenix_live_view 0.17.11) lib/phoenix_live_view/diff.ex:387: Phoenix.LiveView.Diff.traverse/7
(phoenix_live_view 0.17.11) lib/phoenix_live_view/diff.ex:494: anonymous fn/4 in Phoenix.LiveView.Diff.traverse_dynamic/7
(elixir 1.13.4) lib/enum.ex:2396: Enum."-reduce/3-lists^foldl/2-0-"/3
(phoenix_live_view 0.17.11) lib/phoenix_live_view/diff.ex:387: Phoenix.LiveView.Diff.traverse/7
(phoenix_live_view 0.17.11) lib/phoenix_live_view/diff.ex:494: anonymous fn/4 in Phoenix.LiveView.Diff.traverse_dynamic/7
(elixir 1.13.4) lib/enum.ex:2396: Enum."-reduce/3-lists^foldl/2-0-"/3
(phoenix_live_view 0.17.11) lib/phoenix_live_view/diff.ex:387: Phoenix.LiveView.Diff.traverse/7
(phoenix_live_view 0.17.11) lib/phoenix_live_view/diff.ex:138: Phoenix.LiveView.Diff.render/3
(phoenix_live_view 0.17.11) lib/phoenix_live_view/channel.ex:803: Phoenix.LiveView.Channel.render_diff/3
(phoenix_live_view 0.17.11) lib/phoenix_live_view/channel.ex:439: Phoenix.LiveView.Channel.mount_handle_params_result/3
(phoenix_live_view 0.17.11) lib/phoenix_live_view/channel.ex:1003: Phoenix.LiveView.Channel.verified_mount/8
(phoenix_live_view 0.17.11) lib/phoenix_live_view/channel.ex:59: Phoenix.LiveView.Channel.handle_info/2
(stdlib 4.0.1) gen_server.erl:1120: :gen_server.try_dispatch/4
Had a crack at trying to fix this but can't fully grok how the links are being created. The site still runs fine, so not sure what's going on here
Brief Description
Additionally, the pill for Ash doesn't reflect the version that may be selected as an active package.
Steps to reproduce the bug
ash | 2.4.2
still appears in sidebar as a selected package (even though it is not)ash | 2.4.2
still appears in sidebar as a selected packageWe want a nice rich view to pop up when linking to a page on ash_hq.
Brief Description
Certain links, such as: https://ash-hq.org/docs/guides/ash/latest/topics/aggregates#custom-aggregates-in-the-query cause the top of the docs and sidebar to be hidden behind the top-bar.
Steps to reproduce the bug
click: https://ash-hq.org/docs/guides/ash/latest/topics/aggregates#custom-aggregates-in-the-query
Scroll to top
Notice the <h1>
isn't visible.
Notice the top of the sidebar isn't visible, so you can't toggle the visible packages until you refresh the page.
Context
It appears that mix dep template expansion does not work, perhaps only in code blocks? {{mix_dep:ash}} should expand to the selected version of the ash dependency.
This is debatable but this has tripped me up many times so far.
I generally expect to be able to click a search bar and start typing a new search term. E.g., if I search for limit
and then view the results, then some time later I come back to the same tab in my browser and want to search for, say, constraints
and my instinct is to click the search bar and start typing constraints
but with the current behavior this results in limitconstraints
in the search bar.
I can see it being helpful to keep the same search results for the "hmm that result wasn't helpful, let me try one of the other results", so maybe a compromise would be to bring up the modal with the previous text but have the text highlighted so that if the user starts typing, it replaces the existing text by default?
Excited to look into Ash
https://ash-hq.org/docs/guides/ash/latest/tutorials/get-started or any page for that matter is refreshing every 30 seconds or so.
FYI i am using a slow 3g mobile network if that matters.
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.