Git Product home page Git Product logo

fusionauth-site's Introduction

FusionAuth Site

https://fusionauth.io

The FusionAuth site is open source. Found a bug, an issue, or a typo in our docs? Please report using an issue or submit a pull request.

Thanks!
   – FusionAuth team

Building

If you want to submit a PR or test a change to fix a link, etc it may be helpful for you to build and run locally.

Building with Docker

If you have Docker installed your machine, you can use it to build and serve the site. To make things easier, there's a run-docker script to build the container image and mount some cache volumes to speed up future processes.

To build the site and serve it locally, execute ./run-docker --serve to start the Docker container with a local HTTP server available at localhost:4000. For more information, see Build and run a local HTTP server.

You can just build the site with no HTTP server by executing ./run-docker.

Building on your host machine

This project is built using jekyll and asciidoc. You'll need to have ruby installed.

Install

Install these programs:

  • java
  • ruby (2.7.5)
  • plantuml
  • git

gem install bundle bundle install

Build Errors

On M1 Macs, you may receive an error similar to:

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/<username>/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/eventmachine-1.2.7/ext
/Users/<username>/.rbenv/versions/2.7.5/bin/ruby -I /Users/mark/.rbenv/versions/2.7.5/lib/ruby/site_ruby/2.7.0 extconf.rb

To fix this, rebuild the eventmachine gem using:

gem install eventmachine -v '1.2.7' -- --with-ldflags="-Wl,-undefined,dynamic_lookup"
bundle install

Setup Savant

We use the Savant build tool. In order to build and run this project, you'll need to first setup Savant.

Linux or macOS

mkdir ~/savant
cd ~/savant
wget http://savant.inversoft.org/org/savantbuild/savant-core/1.0.0/savant-1.0.0.tar.gz
tar xvfz savant-1.0.0.tar.gz
ln -s ./savant-1.0.0 current
export PATH=$PATH:~/savant/current/bin/

You may optionally want to add ~/savant/current/bin to your PATH that is set in your profile so that this change persists. You'll also need to ensure that you have Java >= 8 installed and the environment variable JAVA_HOME is set.

Build and run a local HTTP server

sb serve

For more information on the Savant build tool, checkout savantbuild.org.

If you are modifying the doc search and want to use a different Algolia index for testing, update the settings in _config.yml. To manually refresh the document search index, use this command: ALGOLIA_API_KEY='<admin api key>' bundle exec jekyll algolia

If you want to clean your Jekyll install, run bundle exec jekyll clean.

CSS changes

This project depends on CSS from the fusionauth-style project.

If you are making changes to the CSS, you'll need to do the following:

  • clone that repo, make changes there on a branch
  • when your changes are done, run sb int which pushes up an integration build (similar to a maven snapshot) to the savant repo.
  • edit your css dependency var to be something like this (with the appropriate version number):
fusionauthWebsiteStyleVersion = "0.2.27-{integration}"
  • then you can commit this and other folks can pull down your changes

Each time you make a CSS change, you can run sb int in fusionauth-style and then sb css in this project to pull down the latest CSS.

Releasing CSS changes

Before you merge your site changes with CSS dependencies to main:

  • do a CSS version release, which will bump the version (see instructions in that repo for more)
  • update the version number in site/_includes/_head.liquid
  • update the dependency in the fusionauth-site savant build file.
  • run sb css
  • check in the new css files.

Deploying to S3

📝 This section is only useful if you work for FusionAuth. Sorry!

Only main is ever released. You should work on a feature branch so that nothing is inadvertently released, but you must merge to main before you release. On every project, including this site, main should always be completely clean and able to be released at anytime.

Deploying happens automatically via a GitHub action when main is updated.

Deploying Redirect Rules

📝 This section is only useful if you work for FusionAuth. Sorry!

The redirects.json file specifies our redirect rules. This file is published to s3 and read by a Lambda function that processes redirects for the site.

  • If you are moving a page around, update redirects
  • If you are adding a page that is an index page, update indexPages
  • If you are adding a new top level file or directory that's pulled from the S3 bucket, make sure you:
    • Add a behavior in CloudFront. You'll need to submit a PR in fusionauth-site-infra for this change.
    • If you are adding a top level file, add an entry to the s3Paths array
    • If you are adding a top level directory, add an entry to the s3Prefixes array

⚠️ When updating this file, please keep items in alpha order.

Sitemap

📝 This section is only useful if you work for FusionAuth. Sorry!

This is the state of things as of Nov 2023.

The sitemap is generated during the Astro build by @astrojs/sitemap.

As of today, we still have static sitemaps that were generated by Jekyll, located in astro/public. These static sitemaps reference the sitemap generated by Astro.

fusionauth-site's People

Contributors

akirabrand avatar alex-fusionauth avatar andrewpai avatar bhalsey avatar blueper avatar bradley-indri avatar bradmccarty avatar brettwp avatar bugfrog avatar dbergal9 avatar fusionandy avatar jobannon avatar johnjeffers avatar lyleschemmerling avatar mark-robustelli avatar matt1hathcock avatar matthew-altman avatar mooreds avatar rideam avatar robfusion avatar robotdan avatar sanjay-fa avatar seanbobby avatar sixhobbits avatar spwitt avatar theminidriver avatar trex avatar vcampitelli avatar voidmain avatar worktheclock 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

Watchers

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

fusionauth-site's Issues

Documentation: registration and user verification

i'm wondering about the relationship between User.verified and Registration.verified for that same user. Also Registration.skipRegistrationVerification vs Registration.skipVerification.

  • It would seem that user verification means we know their email address is verified, and that registration verification means that the user confirms that they have indeed initiated the registration.
  • If a registration requires verification, does a user's clicking the registration verification link implicitly set User.verified to True as well, since that was the email address for the registration? The docs indicate something similar for Registration.sendSetPasswordEmail
  • would requiring registration verification and email verification send two separate emails to the user?
  • What effect, if any, does Registration.verified have, if false? Should it prevent a login?

For reference, i'm looking at:

User.verified (source):

Whether or not the User’s email has been verified.

Registration.verified (source):

This value indicates if this User’s registration has been verified.

Registration.skipRegistrationVerification (source):

Indicates to FusionAuth that it should skip registration verification even if it is enabled for the Application.

Registration.skipVerification (source):

Whether or not email verification should be skipped or not. In some cases, you might want to verify User’s emails and in other cases you won’t. This flag controls that behavior.

OpenID Connect: Azure AD

I am trying to integrate the Azure AD integration. I followwed the guide that is mentioned here - https://fusionauth.io/docs/v1/tech/identity-providers/openid-connect/azure-ad

I can see "Login with Azure" button on login page. When I do click that:

  1. I redirect to the Azure login page.
  2. I enter my credentials.
  3. I redirect back automatically to FusionAuth page (at "/oauth2/callback") with query strings - code, state and session_state. State query string is having following encoded values:
- client_id=<Some Guid>&
- code_challenge=tNh57rNR_z11CoKMGrHyWJiJns2DGCQwcIqAwGelDdE&
- code_challenge_method=S256&
- metaData.device.name=Windows Chrome&
- metaData.device.type=BROWSER&
- nonce=VXZ1NkhYcEczZ0hUWllFc3NQeE44Ql9CZWtmekN4S05CN2VGSlN4aEYxLXF-&
- redirect_uri=<application url>&
- response_mode=&
- response_type=code&
- scope=openid profile offline_access&
- state=VXZ1NkhYcEczZ0hUWllFc3NQeE44Ql9CZWtmekN4S05CN2VGSlN4aEYxLXF-&
- tenantId=<Some GUID>&
- timezone=Asia/Calcutta&
- user_code=&
- identityProviderId=<Some Guid>

I get this error redirection (to "/oauth2/callback") page:

{
  "error" : "invalid_request",
  "error_description" : "The request is missing a required parameter: redirect_uri",
  "error_reason" : "missing_redirect_uri"
}

Please assist.

Validate email template when taking a user action in the UI to ensure it renders

Problem

In the admin UI you can action a user with an email template that is not designed to send directly - and instead is only meant to be sent through the Change Password workflow.

When you configure an action with the Change Password template, it fails silently because it cannot be rendered without a changePasswordId.

Solution

FusionAuth could render this template as part of validation, or synchronously render it to ensure it will be able to be sent so we can provide a meaningful error in the UI. Perhaps as simple as, The requested email template failed to render properly, see the Event Log.

Original title

Replacement variables configured in email templates throw an Exception

Original Issue

Hello,

I am having an issue with the replacement variables changePasswordId and verificatoinId for email templates.

I tried to follow the instructions described here: https://fusionauth.io/docs/v1/tech/email-templates/email-templates

My fusionauth DB is compatible with version 1.7.1 and my server is running on FusionAuth™ version 1.7.2

When I try to send an e-mail through an User Action that is configured to use an e-mail template, I have the following error:

fusionauth_1  | Aug 27, 2019 2:06:34.637 PM ERROR io.fusionauth.api.util.EmailTools - An [Error] EventLog with Id [16] was created.
fusionauth_1  | {
fusionauth_1  |   "id" : 16,
fusionauth_1  |   "insertInstant" : 1566914794630,
fusionauth_1  |   "message" : "Email send failure. See reasons below.\n\nRender Errors\n---------------\nhtml : freemarker.core.InvalidReferenceEx
ception: The following has evaluated to null or missing:\n==> changePasswordId  [in nameless template at line 14, column 58]\n\n----\nTip: If the
failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDe
fault, or use [#if myOptionalVar??]when-present[#else]when-missing[/#if]. (These only cover the last step of the expression; to cover the whole ex
pression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??\n----\n\n----\nFTL stack trace (\"~\" means nesting-related):\n\t-
 Failed at: ${changePasswordId}  [in nameless template at line 14, column 56]\n----\n\n",
fusionauth_1  |   "type" : "Error"
fusionauth_1  | }
fusionauth_1  | Aug 27, 2019 2:22:59.170 PM ERROR io.fusionauth.api.util.EmailTools - An [Error] EventLog with Id [17] was created.
fusionauth_1  | {
fusionauth_1  |   "id" : 17,
fusionauth_1  |   "insertInstant" : 1566915779164,
fusionauth_1  |   "message" : "Email send failure. See reasons below.\n\nRender Errors\n---------------\nhtml : freemarker.core.InvalidReferenceEx
ception: The following has evaluated to null or missing:\n==> verificationId  [in nameless template at line 14, column 58]\n\n----\nTip: If the fa
iling expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefa
ult, or use [#if myOptionalVar??]when-present[#else]when-missing[/#if]. (These only cover the last step of the expression; to cover the whole expr
ession, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??\n----\n\n----\nFTL stack trace (\"~\" means nesting-related):\n\t- F
ailed at: ${verificationId}  [in nameless template at line 14, column 56]\n----\n\n",
fusionauth_1  |   "type" : "Error"
fusionauth_1  | }

This is my e-mail template:

<style>
  body {
    font-family: "arial", Sans-Serif;
  }
</style>


<p>
Dear user,
</p>


Click on the following link to reset your password.
<p><a href="https://mydomain.com/password/change/${changePasswordId}">https://mydomain.com/password/change/${changePasswordId}</a></p>


After you have reset the password, please sign in to :
  <p><a href="https://myapp.com">https://myapp.com</a></p>

<p>
If you have any questions, please reply to this mail.
</p>
<p>
Kind regards,
</p>
<p>
Support Team

</p>

When I sent an e-mail though an User Action with templates without the replacement variable changePassowrdId, it works. I successfully receive the message.

Maybe I forgot to configure something?

Best regards,
Bruno.

Rending issues on Microsoft Edge

There are several rendering issues when using Microsoft Edge.

Tested with Windows 10 (10.0.17763.134), Edge version 44.17763.1.0

  1. Tab layout
  2. Scroll bars on the install commands
  3. Scroll bars in the documentation nav
  4. Scroll bars in the documentation FastPath

See attachments

screen shot 2018-11-21 at 8 25 35 pm

screen shot 2018-11-21 at 8 25 47 pm

screen shot 2018-11-21 at 8 25 24 pm

Update docs to not break words when on desktop

Opened from comments to #129

    <style>
      /* Mobile layout overflow, we could move this into fusionauth-style */
      a, code {
        word-break: break-all;
      }
    </style>

This causes weird breakage on the desktop site. See screenshot where the link 'identity provider' splits in the middle of a word:

Screen Shot 2020-07-10 at 11 34 45 AM

Should move this style to fusionauth-style and have it only apply on mobile devices.

Tenant External Id updates

Missing

  • deviceCodeTimeToLiveInSeconds
  • deviceUserCodeIdGenerator
  • Add since flags

Others? Not sure, do a quick audit.

Integration of nyc.id IDP into FusionAuth

Hello,

I need to integrate nyc.id for my application using FusionAuth as the service provider. nyc.id needs the meta data of the service provider. I do not see any option in FusionAuth to download that.
Please guide on how nyc.id SAML IDP can be integrated through FusionAuth

Proposal: Add FAQ and discuss why FusionAuth is not open-source

From my personal expierence and questions from team mates I would consider that there might be more people interested in a FAQ section on the FusionAuth website. There are so many good blog articles, like https://fusionauth.io/blog/2019/03/06/keycloak-fusionauth-comparison ... it might be worth extracting some facts answering common questions like why is FusionAuth is not open-source, what are the advantages / disadvantages, link to support plans etc.

Release Notes TOC issues

The release notes toc is a bit different then the other sub menu navs.

Here is how I think the liquid template should be built

<li {% if page.url == "/docs/v1/tech/release-notes.html" %}class="open"{% endif %}>
  <a href="#" class="sub-menu"><i class="fal fa-fw fa-list-ol"></i> Release Notes <i class="fal fa-chevron-{% if page.url == "/docs/v1/tech/release-notes.html" %}up{% else %}down{% endif %} fa-fw"></i></a>
  {% if page.showreleasetoc == 1 %}
  <div id="releasenotestoc">
    {{ page.document | tocify_asciidoc }}
  </div>
  {% endif %}
</li>

This would work if we can control the HTML that is produced by the tocify_asciidoc- not sure where or how that is built.

I wonder if there is a better way to build this, the nav gets crazy tall when we expand this, and it is only going to get worse.
We could make a select box on the release notes page and on select it scrolls to the correct version. We could do that entirely in JavaScript if we want.

image

Associate Theme to application

Hello,
I've a docker with fusionauth. I've created a theme but I cannot see where associate it to application. Can you help me?

Lambda return all docs incorrect

In the docs on the return result for fetching all lambdas (here: https://fusionauth.io/docs/v1/tech/apis/lambdas#retrieve-a-lambda), the docs show an array of objects which have an additional nested lambda object. I was happy to see is NOT the case, as shown by the result of the api call below. This is a much better-shaped response, but the api docs should be updated.

{ lambdas: [
  {
    body: '// Using the user and registration parameters add additional values to the jwt object.\r\n' +
      'function populate(jwt, user, registration) {\r\n' +
      "  //  When writing a lambda we've added a few helpers to make life easier.\r\n" +
      "  //  console.info('Hello World');         # This will create an EventLog of type Information\r\n" +
      "  //  console.error('Not good.');          # This will create an EventLog of type Error\r\n" +
      "  //  console.debug('Step 42 completed.'); # This will create an EventLog of type Debug\r\n" +
      '  //  \r\n' +
      '  //  To dump an entire object to the EventLog you can use JSON.stringify, for example: \r\n' +
      '  //  console.info(JSON.stringify(user)); \r\n' +
      '\r\n' +
      '  // Happy coding! Populate your JWT here.\r\n' +
      '  \r\n' +
      "  jwt.name = user.firstName + ' ' + user.lastName;\r\n" +
      '}\r\n',
    debug: false,
    enabled: true,
    id: '90e4f6ff-8377-42f7-b1b0-7efed409d851',
    insertInstant: 1583358212988,
    name: 'jwt-populate',
    type: 'JWTPopulate'
  }
] }

Bottom of pricing page looks a bit wonky on mobile

In two places, things are cut off. See attached screenshots.

This is using Firefox on desktop, with the mobile view devtool setting.

Also tested on chrome and firefox on a real android phone and saw similar issues.

Screen Shot 2020-07-07 at 10 21 37 AM

Screen Shot 2020-07-07 at 10 21 23 AM

API Documentation for Tenants incomplete

It seems that the documentation for /api/tenants is not reflecting some of recent changes.
Missing elements are (there might be more):

tenant.externalIdentifierConfiguration.changePasswordIdGenerator
tenant.externalIdentifierConfiguration.emailVerificationIdGenerator
tenant.externalIdentifierConfiguration.passwordlessLoginGenerator
tenant.externalIdentifierConfiguration.registrationVerificationIdGenerator
tenant.externalIdentifierConfiguration.setupPasswordIdGenerator
tenant.issuer
tenant.jwtConfiguration

I understand those elements have been moved from "System configuration" to the tenant level.
In the meantime, the API error messages are helpful enough to be able to work with tenants via the API.

Edit: This is for version 1.9.2

Refresh a JWT: POST /api/jwt/refresh - 404 Response

According to the documentation https://fusionauth.io/docs/v1/tech/apis/jwt#refresh-a-jwt it should be possible to refresh a (valid) refresh token with the help of:

curl --request POST \
  --url http://localhost:9011/api/jwt/refresh \
  --header 'authorization: -mz.....oc_x0pBniIn-eaXJsF-w....U' \
  --header 'content-type: application/json' \
  --data '{
	"refresehToken": "Zg.....OC-Jf9......................vIQ"
}'

... but a HTTP Status 404 (not found) is returned.

NOTE: I tried with and without Authorization Header (ApplicationID should not be required if I interpret the documentation properly).

missing ExternalJWT login API doc

This API section should document the login API, similar to the rest of the types that have a Complete the Facebook Login Request section.
https://fusionauth.io/docs/v1/tech/apis/identity-providers/external-jwt

This should more/less be the same as the JWT Reconcile doc.
https://fusionauth.io/docs/v1/tech/apis/jwt#reconcile-a-jwt

WE could review this and decide if we want to fully deprecate the JWT Reconcile API since it just calls through to the IdP Login API. This API was a legacy API prior to IdPs.

Broken links in https://fusionauth.io/docs/

Links inside "Tenants & Apps" are broken.

To automatically handle this in the future, I suggest using a Link Checker service, which will periodically scan your site for broken links. (some services may also provide SEO suggestions, etc.)

Guide for Azure AD SAMLv2

i would have appreciated some more guidance configuring a SAML v2 Identity Provider for Azure AD (not ADFS). Here's what i've done so far, to check my assumptions, and in case anyone else is trying to do the same:

Ref: https://docs.microsoft.com/en-us/azure/active-directory/manage-apps/configure-single-sign-on-non-gallery-applications

  • installed FusionAuth (1.15.2) and made it available over DNS (i used ngrok to connect localhost:9011 to a reserved subdomain, for the time being)
  • configured an Azure Enterprise ("non-gallery") application with SSO support via SAML v2. The "Single sign-on" page looks something like this:
    1. Basic SAML Configuration
      • Identifier (Entity ID): used FusionAuth issuer (see below)
      • Reply URL: used FusionAuth SAML callback/ACS URL (see below)
    2. User Attributes & Claims
      • not sure yet how to best configure assigning user.email and user.principalname to SAML claim names
    3. SAML Signing Certificate
      • downloaded base64 key, added it in FusionAuth Key Master
    4. Set up {appname}
      • noted Login URL
    5. Test single sign-on with {appname}
      • this lands me at /samlv2/acs with an error looking like:
        {
          "error" : "invalid_request",
          "error_description" : "The request is missing a required parameter: redirect_uri",
          "error_reason" : "missing_redirect_uri"
        }
        That looks like an OAuth error, so i'm assuming this means the Azure test doesn't follow up with an adequate OAuth flow?
  • configured a FusionAuth Identity provider of SAML v2 type
    • IdP endpoint: used Enterprise app Login URL (from step iv. above)
    • Verification key: used key created in FusionAuth Key Manager from step iv. above)
    • noted ACS and Issuer for Enterprise app config (for step i. above)

i do have this working for the FusionAuth app (it creates the user, but auto-registration isn't supported) - after i create the registration manually, i can see that it works.

Is SAML v2 Logout URL supported in FusionAuth's SAML configuration?

How should i handle mapping user attibutes and claims? What claims are FusionAuth expecting?

Am i on track with my assumptions about the response to the Enterprise App SSO test's response?

/api/login: want to restrict response

Hi,
if I use the API to login (POST /api/login, with or without applicationId) I get with the registrations for all applications the user is registerded to. For security reason I want

  1. applicationId mandatory for request or without this Id no registrations are send
  2. in the response object only the information belonging to this application

An application should not be interested neither if the user is registerd for other applications nor what roles he has in these foreign applications. For us this is a mandatory security feature.

Is there a possibility to configure fusionAuth so this behavior can achieved?

knut

Documentation: User Consent retrieval API

Consent API endpoints documentation lacks the description of User Consent retrival. I have found out that I can retrieve such information with requests such as

GET /api/user/consent/{userConsentId}

or with more useful request such as

GET /api/user/consent/?userId={userId}

Since the behaviour is not documented, one cannot be sure if the API will not be a subject to rapid changes. Also, based only on the documentation, there is no way to retrieve user consent data at all.

Localization for Emails

Creating a localization for email templates does not work when using none latin based languages such as chinese, japanese and korean.

These characters after saving turns into "?" in the database. The database field collation unicode is correct though.

The step to reproduce:

  1. create localization
  2. save the localization
  3. save the email template
  4. open it up again, all unicode characters becomes ?

Screen Shot 2019-07-11 at 5 32 39 PM
Screen Shot 2019-07-11 at 5 33 15 PM

Validating understanding of docs regarding ID token claims

i'm not sure whether there is a problem with the documentation per se, but i am surprised at some behavior of FusionAuth based on my comprehension of the documentation, and i'd like to validate my understanding of expected behavior.

First, i'm wanting an ID token with the applicationId as a claim, beginning with an unauthenticated user who will be providing their username and password. Assume the tenantId and applicationId are known. It appears that i cannot get such a JWT at POST /api/login (with tenantId set in a header) since that initial request with username/password in the body call will not be authenticated. However, with the ID token in the login response, i can make an authenticated GET /api/jwt/issue?applicationId={applicationId} to get one.

Is that the simplest route possible (two requests)?

Second, regarding an ID token populate lambda, i have not been able to see the claims transformed in the following cases (having selected the lambda at both the tenant and the application level):

  • in the token returned by GET /api/login with the tenant header set
  • in the token returned by POST /api/jwt/issue with the applicationId query param set, regardless of whether "JWT" toggle is enabled at the application level.

Default tenant, and default application, initially, but then i created a new application in that tenant and had the same behavior.

In what case(s) should i see the ID token claims be transformed by a lambda? Where should i find console logs? i'm not seeing them in the container stdout for any level (error/info/debug). [EDIT]: i did find a log for a lambda invocation at /admin/system/event-log/

Here is the lambda, as a sanity check:

function populate(jwt, user, registration) {
  jwt.foo = "bar";
}

FusionAuth 1.15.4

LDAP as an identity provider

Please add LDAP as an identity provider.

So far the I like the look and feel but can’t use it. I would like to deploy this into customers’ sites, but they don’t run ADFS, they have AD or LDAP.

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.