Code Monkey home page Code Monkey logo

ee-master-config's Introduction

Focus Lab LLC’s EE Master Config

The purpose of this repository is to share our quick multi-environment setup for ExpressionEngine 2. We use this on every EE project to quickly and easily get support for multiple servers setup. This enables us to deploy any of our sites to any server with minimal changes or updates to any code or settings.

This branch is for EE2. If you’d like the EE3 Master Config check out the EE3 branch.

Introduction

At Focus Lab we work in multiple environments for every ExpressionEngine site we build. (For the sake of simplicity we’ll just define an environment as “any server running an instance of your site.”) In order for ExpressionEngine to support quick and easy deployments across environments, you need to use a robust config file. This is our approach to doing just that. A big strength in this approach is that we can ignore our local environment config file from Git. That way each local developer has their own config overrides that won’t affect the main repository.

The folder structure for a given project is the following:

/config
   - config.{env}.php
   - config.env.php
   - config.master.php
/public_html
/system

Where {env} is a shorthand hand for our environment. We typically have 4 environments. Production, Staging, Shared development & Local development. That in mind, our files are:

config.dev.php
config.env.php
config.local.php
config.master.php
config.prod.php
config.stage.php

Concept

There are three primary pieces to this structure. Environment declaration, master config values & environment-specific config values.

Environment Declaration

This file is the starting point of your environment setup. Based on the HTTP_HOST variable in PHP we define the environment (this may change if you’re using a load balance environment or EE’s MSM module). This is handled in the config.env.php file.

We approach the environment from the top down. We define all environments based on the domain and then set our default to “local” which allows our local developers to use whatever domain they choose (eg: mysite.dev, mysite.local, etc).

Three constants are defined in our environment declaration file. They are:

  • ENV
  • ENV_FULL
  • ENV_DEBUG

ENV

This is the short-hand name of your environment. It needs to directly reflect the naming convention of your environment-specific file (seen below) such as config.local.php. This value is used as a conditional occasionally in the master config file.

ENV_FULL

This is the full name of your environment. There are no requirements on this value. We simply use it in our templates from time to time (“You are currently in the Staging environment”).

ENV_DEBUG

This is our boolean debug flag used frequently in our master config file. It allows us to keep debug settings “on” in specific environments. You can see how this is used in the master config file.

Master Config file

Our config.master.php file contains the bulk of the data for our setup. These are default configuration settings for our EE projects. Here we break up config settings into logical groups and add/remove as needed per project. In plain English, this is what the config.master.php document does/says:

If EE is looking for database credentials
	Load our environment-specific file (eg: config.prod.php)
	Define our DB cache directory
	Merge our expressionengine/config/database.php array with our environment-specific db array
	Unset our environment-specific array now that it's been used as needed
End if

If EE is looking for config array values
	Define our base paths (as inspired by Matt Weinberg)
	Define our template config settings
	Define our Debug settings
	Define our Performance-impacting settings
	Define any 3rd party settings
	Define any member-specific settings
	Define some final, miscellaneous settings
	Load our environment-specific config file (eg: config.prod.php)
	Setup some global variables for template use: {global:env} and {global:env_full}
	Merge our Global Variables arrays then our Config arrays
End if

Override Options

You can find a list of available configuration override options here on the EE Wiki page EE 2 Config Overrides. You can alternatively find individual setting array keys by “inspecting” elements within EE’s Control Panel and taking note of the input names. Third party developers may also include config override support in their add-ons.

Templates Settings

You can now change the location of your templates directory. Find $env_config['tmpl_file_basepath'] around line 132 in the config.master.php and change the value as needed.

Global Variables

You can define a set of template global variables in the config.master.php file as well. Around line 232 you will see that there are 2 variables available as an example. You can add anything here that you prefer, such as default date format strings etc.

Environment-Specific Config

The final piece to the equation is the environment-specific file. This file include the database credentials and any desired config overrides or global variables. This is the simplest and shortest of the three files.

There are three possible arrays to use here. They are $env_db, env_config and $env_global.

$env_db

This is just for your database credentials for the environment. What makes this convenient is that we ignore our config.local.php file from Git. That way each local developer has their own config overrides that won’t affect the main repository.

$env_db['hostname'] = '';
$env_db['username'] = '';
$env_db['password'] = '';
$env_db['database'] = '';

$env_config

This array allows you to override any config value from EE or from the master config file. This is useful for changing things that may be unique to a test environment. A good example would be the webmaster_email setting. If a single developer wants to receive all system emails to themselves when developing locally, they might use the following:

$env_config['webmaster_email'] = '[email protected]';

$env_global

This array is for defining global variables available within your EE templates. An example of how this can be used is the idea of using Google Analytics (GA) to track stats on your site. In the past we’ve used GA for tracking Staging and Production environments separately. Doing this was simple because we could define the GA key per-environment as needed.

$env_global['global:google_analytics'] = 'UA-XXXXXXX-XX';

This gives you variables like {global:google_analytics} in your EE templates.

Setup

  • First, make sure you’re working in an pre-existing EE install (even if you just installed EE a few minutes ago). You can’t setup this config until after EE is installed.
  • Copy the /config directory to the same directory level as your system directory (we recommend above web root)
  • Modify config.env.php to reflect your environments and domains. You can remove and add environments as needed
  • Update each config.{env}.php file with each environment’s database credentials as needed
  • Create config overrides and global variables for each environment as needed
  • Add the following code to the bottom of system/expressionengine/config/config.php (be sure not to delete other config settings already in this file):
/**
 * Require the Focus Lab, LLC Master Config file
 */
require $_SERVER['DOCUMENT_ROOT'] . '/../config/config.master.php';


/* End of file config.php */
/* Location: ./system/expressionengine/config/config.php */
  • Replace the contents of your system/expressionengine/config/database.php file with the contents in of the same file in this repository

Above webroot vs within webroot

The instructions above are for setting up the config above webroot (your “public_html”, “htdocs”, etc directory). This is recommended for security. However, if you’re unable to do this due to hosting restraints you can find the necessary changes to support this on StackExchange.

MSM Support

MSM is a tricky one due to the variety of ways the server directory structure can be setup. We recommend keeping each site’s “public” directory siblings to one another, so the relative paths are all identical and accurate. Alternatively, you can define paths in each site’s index.php file as recommended in this gist: https://gist.github.com/d27570a3e52bdf656f54.

Contributions

If you’re interested in making this better please feel free to fork the code on GitHub and send pull requests. Also, we’d love to track any potential issues through the repository’s Issues tracker.

Support

We are happy to answer questions as needed and able, but there is no official support for using this config setup. Use it at your own risk with the understanding that our responses to any inquires will fall behind any commitments we may have at the time.

Legal

Disclaimer Of Warranty

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF QUALITY, PERFORMANCE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.

Limitations Of Liability

YOU ASSUME ALL RISK ASSOCIATED WITH THE INSTALLATION AND USE OF THE SOFTWARE. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS OF THE SOFTWARE BE LIABLE FOR CLAIMS, DAMAGES OR OTHER LIABILITY ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE. LICENSE HOLDERS ARE SOLELY RESPONSIBLE FOR DETERMINING THE APPROPRIATENESS OF USE AND ASSUME ALL RISKS ASSOCIATED WITH ITS USE, INCLUDING BUT NOT LIMITED TO THE RISKS OF PROGRAM ERRORS, DAMAGE TO EQUIPMENT, LOSS OF DATA OR SOFTWARE PROGRAMS, OR UNAVAILABILITY OR INTERRUPTION OF OPERATIONS.

ee-master-config's People

Contributors

erikreagan avatar jacobrussell avatar jonathanmelville avatar natetronn avatar

Stargazers

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

Watchers

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

ee-master-config's Issues

Setting global variables in config files not working

I have $env_globals['global:basepath'] = 'http://xxxxxx.com/'; in config.local.php but in my templates, I get {global:basepath} output instead of the value.

This is under a MAMP set-up on my Mac. Everything else works fine. Is there something else I'm missing?

Images: setting relative path

I would like to set my images to use relative paths so that for each image it is not having to resolve the domain lookup. I'm trying to configure my site to load as fast as possible.

How can I set images to use relative paths?

A Database Error Occurred

We've been getting this issue intermittently after each new deployment (using springloops.io for git to ftp). I can't seem to pinpoint exactly what the issue is, it doesn't seem to be url specific as I get the same error no matter what urls I visit, including admin.php. The error:

A Database Error Occurred
Unable to connect to your database server using the provided settings.

Filename: core/EE_Config.php

Line Number: 207

And .htaccess just in case:

<IfModule mod_rewrite.c>
        RewriteEngine On
        # Removes index.php from ExpressionEngine URLs
        RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ /index.php?/$1 [L]
</IfModule>

Any clues to how I can troubleshoot?

Database Error

Hello,

I set up my master config files on my local computer and it worked fine. However as soon as i move the site to the dev folder, i keep getting the following error

A Database Error Occurred
Unable to connect to your database server using the provided settings.
Filename: core/EE_Config.php
Line Number: 207

I can't seem to figure out what might be wrong. I tried using the exit(ENV); in my config.env.php file, but it does not seem to be having any effect i can see.

Any ideas on how i can see what is really causing the error? I have tried access the database using the supplied credentials and they work. So i am thinking it might be a path issue or a wrong environment is being picked.

Dealing with third-party path and themes

Hi! Hopefully you can help me with a particular request.
I would like to move the third-party modules folder out of the webroot for maintainance sake. I would like to manage them as git submodules. How do you deal at FocusLab with the themes though? Do you use symlinks?

Migrating from EE2 to EE3

HI. I have a site implementing your very cool config master. Do you have any experience upgrading from EE2 to EE3 with this in place? The Ellis Lab core upgrade instructions assume a default config. Thanks!

Using Config Variables Inside Environment Files

I've been trying to set some variables on a per-environment basis inside Master Config, but I keep getting browser errors. For example, if I put this at the bottom of config.local.php:

if ($site_id == '1') {
    $env_config['webmaster_email'] = '[email protected]';
} else {
    $env_config['webmaster_email'] = '[email protected]';
}

I get a browser "can't load this page" error.

What am I doing wrong here?

Daylight Savings Check

Guys,

Minor issue, but I think you forgot the '%' in your check for daylight savings. Line 217 in config.master.php:

$env_config['daylight_savings']         = date('I') ? 'y' : 'n'; // Autodetect DST

Should be this:

$env_config['daylight_savings']         = date('%I') ? 'y' : 'n'; // Autodetect DST

Added the '%' to date('**%**I)

Thanks.
Dan

EE4

Hello everybody,

are there any ambitions to create an EE4 branch? Over the weekend I have tried the EE3 code with a fresh install of EE4.0 but it did not work. At least not in my case and not out of the box. Whilst having installed the focuslab ee-master-config on a couple of sites I couldn't say what exactly wasn't working, so any information or exchange with others would be great!

Thanks

System Configuration Overrides per Site in a MSM

I have master config successfully working on EE3 with MSM, but cannot figure how to customize config overrides per site for things like theme path and them url, file upload directories, etc.

I'd rather not have this info stored in the db for each site as it's a hassle for local to remote database imports.

Using Multi-config in a subdirectory?

I'm having trouble with getting the .htaccess correct when using multi-config in a subdirectory. Here's my directory set up:

/config
/config_site2
/public_html
-.htaccess
-/site2
--.htaccess
/system
/system_site2

I have two multi-config files in two directories above the root (/config and /config_site2) along with two system folders (/system and /sytem_site2).

In the /public_html folder, I have the subdirectory (/public_html/site2) that's correctly rendering site2.

I'm consistently getting 500 server error, however. Here's the .htaccess file for site2:

#------------------- remove trailing slash -------------------
RewriteCond %{REQUEST_URI} !^/system_site2 [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)/$ /$1$2 [R=301,L,QSA]
#------------------- index.php -------------------
#strip index.php from the URL if that is all that is given
RewriteCond %{REQUEST_URI} !^/site2/system_site2
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)index.php\ HTTP/
RewriteRule ^(([^/]+/)
)index.php$ https://%{HTTP_HOST}/site2/ [R=301,NS,L,QSA]
#strip index.php/* from the URL
RewriteCond %{THE_REQUEST} ^[^/]/site2/index.php/ [NC]
RewriteRule ^index.php/(.+) https://%{HTTP_HOST}/$1$2 [R=301,L,QSA]
#------------------- CE Cache Static Driver -------------------
RewriteCond %{REQUEST_URI} !^/system_site2 [NC]
RewriteCond %{QUERY_STRING} !ACT|URL [NC]
RewriteCond %{REQUEST_METHOD} !=POST [NC]
RewriteCond %{DOCUMENT_ROOT}/static/ce_cache/190328/static%{REQUEST_URI}/index.html -f
RewriteRule (.
) /_static_cache_handler.php%{REQUEST_URI}/index.html [L,QSA]
#------------------- EE -------------------
#rewrite all non-image/js/css urls back to index.php if they are not files or directories
RewriteCond $1 !.(css|js|gif|jpe?g|png) [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /site2/index.php/$1 [L,QSA]

What am I overlooking? Thanks much in advance!

Synchronize templates in production

Hi,

don't know if I'm doing anything wrong... but here's the situation:
I want to fetch the templates from the database in production.

So I uncomment the following line:

$env_config['save_tmpl_files'] = (ENV == 'prod') ? 'n' : 'y';

But then in EE, I can't synchronize my templates and get the following message:

Saving templates as text files is not currently enabled in global template preferences.

I'm pretty sure I'm in the 'prod' environment, otherwise I would not be able to connect to the database.

Happened before? Any ideas?

kind regards,
Vic

Updating mysql variable to use mysli EE2.9.3

I haven't contributed to any git issues before, please bear with me if I'm doing this in the wrong area or formatting my question incorrectly. I don't know if this even qualifies as an issue either.

I'm setting up a new project using EE 2.9.3 and making use of FocusLab's Master Config. I'm noticing (for the first time) when you do an install, EE offers the option to use MySQLi or MySQL - defaulting to MySQLi. And if you take a look at the Master Config database.php file there's a var for dbdriver, it's default value is "MySQL". I'm assuming that I should just use the same value that EE had created when I performed the EE install "mysqli", which I"m guessing should just work and shouldn't be an issue at all.

In the future will Master Config default to MySQLi as the dbdriver value? I'm no expert in this area, but before making any choice during the EE install, I had to do some research to become familiar with what MySQLi was anyway. Based on the docs I was reading, the impression I've got is MySQLi is the preferred way to go as long as your server's using php5... again, not an expert, just wanting to contribute to things overall.

Hope this is helpful in some way.
Reuben

MSM Example

Hey Erik,

This isn't so much an issue as a (hopefully) small request. I've been using this for several sites, but I'm getting ready to use it for a site that uses MSM. I'm not 100% sure how to go about doing that and would love to see an example when you get a chance.

Thanks!
.angie

Database connection error when forcing trailing slashes in .htaccess

Thanks for the great addition to the EE community!

I'm having an issue when I try to force trailing slashes using some .htaccess rules. When I add the appropriate rules I get an error of:

A Database Error Occurred
Unable to connect to your database server using the provided settings.

Filename: core/EE_Config.php

Line Number: 211

The error only occurs when I try to access a URL that doesn't have a trailing slash. When I do that I get redirected to appropriate URL (with a trailing slash) but on port 7080. Example:

If I try to access:

http://mydomain.com/something/else

I get redirected to:

http://mydomain.com:7080/something/else/

And then the database error is shown.

Here are the .htaccess rules I'm using for removing the trailing slashes:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule ^(.*)$ $1/ [L,R=301]

If I remove those 3 lines everything works fine.

Also, I'm currently working on the site using dedicated IP address instead of the final domain name. So that might have something to do with it, but I'm not entirely sure.

Have you encountered this before?

File Upload Directory Paths Causing Issues With Modules

After setting up custom upload directory paths in /config/config.master.php, some add-ons that use file paths have been breaking.

With Pixel & Tonic's Assets v1.2.2, the image preview thumbnails appear broken in the browser pane. When I right-click on a preview image and choose "view file", the URL it opens looks like this:

http://www.mysite.com/?ACT=33&file=%7Bfiledir_1%7Dmy-image.png

With Solspace Freeform 4.0.6, for a form with a file upload field, if I select "Include Attachment" in a notification template, the resulting email will be blank.

Images and files all display correctly on the front-end when used in templates. Commenting out the upload directory configurations in config.master.php fixes both problems.

Here is an example of my upload directory configuration in /config/config.master.php:

$env_config['upload_preferences'] = array(
    1 => array(
        'name'        => 'Main Upload Directory',
        'server_path' => $images_path . '/uploads/main',
        'url'         => $images_path . '/uploads/main/'
    ),
    2 => array(
        'name'        => 'Portfolio',
        'server_path' => $images_path . '/uploads/portfolio',
        'url'         => $images_url  . '/uploads/portfolio/'
    ),
    3 => array(
        'name'        => 'WYSIWYG Uploads',
        'server_path' => $images_path . '/uploads/wysiwyg',
        'url'         => $images_url  . '/uploads/wysiwyg/'
    )
);

I have experienced these problems in EE 2.5.2 and 2.5.3 with Master Config 1.1.1.

entry_url in Email Notification Templates

I am using this config file to streamline my dev, staging, and production deployments, but I am having one issue that I can't quite figure out.

My Entry Notification Email is as follows:

A new entry has been posted in the following channel:
{channel_name}

The title of the entry is:
{entry_title}

Posted by: {name}
Email: {email}

To read the entry please visit: 
{entry_url}

Problem is: the entry_url is not updating across deployments, while everything else under the sun is.
In other words, dev.example.com is where the entry was created, after migrating to staging, the email template still displays dev.example.com rather than staging.example.com.

Any ideas?

msm site_name in config file

Hello,

would it be possible to have the site_name variable available in the config file for a msm setup?
I've set the upload paths in the config file, but I'd like the images in a separate site folder

eg.
$assign_to_config['upload_preferences'] = array( 1 => array( 'name' => 'Static imagessss', 'server_path' => '/Users/username/Documents/workspace/site/assets/uploads/site_default/images/static/', 'url' => 'http://site.localhost/assets/uploads/'. $config["site_name"] .'/images/static/' ), 3 => array( 'name' => 'Sponsor images', 'server_path' => '/Users/username/Documents/workspace/site/assets/uploads/site_default/images/sponsor/', 'url' => 'http://site.localhost/assets/uploads/'. $config["site_name"] .'/images/sponsor/' ) );

I've already tried several things... but no solution so far.

Any insights are welcome ;-)

kind regards,
Vic

EE3

Hi,

Are you planning an EE3 version?

Undefined method site_prefs

Hello,

In a stock install of EE running on my local Mac's Apache, I've done the following:

  1. Move the system folder above the public_html root.
  2. Change config.php and database.php to match the examples.
  3. Edit the config.local.php file to match the desired settings.

When I try to run it, I get the following error:

Fatal error: Call to undefined method CI_Config::site_prefs() in /Users/username/Sites/projects/sitename.local/system/expressionengine/libraries/Core.php on line 122

Any way you can help with this?

Thanks,
Jonathan

Questions About Load Order

I'm messing around with MSM and I have a question about the order config files are loaded in. Is this correct?:

  1. index.php or admin.php
  2. /system/expressionengine/config.php
  3. /system/expressionengien/database.php
  4. /config/config.master.php
    1. /config/config.env.php
    2. environment-specific config file (/config/config.local.php)

I'm also confused about when/how config.env.php gets loaded. The only reference I see for it is in config.master.php at line 36, but the comments & code imply that the environment should already have been defined. If that's the case - where is the environment defined?

Incorrect emoticon_path in config.master.php?

Hey Erik,

I think the line 107 of config.master.php should read as;

$env_config['emoticon_path']       = $images_path  . '/smileys/';

instead of;

$env_config['emoticon_path']       = $images_url  . '/smileys/';

URL to root directory of site changes when importing a database from another environment.

Hey guys,

I'm noticing that when I export my database from staging and import it on local, my URL to root directory is using the value form the environment I imported the database from for things like the "View Page" link on Structure pages. However, when I go to Admin -> General Configuration, all of the path and url fields are populated with the correct values. Simply clicking submit on that page fixes the issue.

Any idea if this is related to the master config file somehow?

I'm using EE 2.8.

Database Error

When going to the site natirar.com -

A Database Error Occurred
Unable to connect to your database server using the provided settings.

Filename: core/EE_Config.php

Line Number: 180

^ this appears

When attempting to login to the back end of the site, it does not allow me to either

Extra slash added for env_config['cp_url']

Hello,

I just noticed that the $env_config['cp_url'] variables gets an extra slash. This is in config.master.php, around like 105. See:

$env_config['base_url']            = $base_url . '/';
$env_config['site_url']            = $env_config['base_url'];
$env_config['cp_url']              = $env_config['base_url'] . '/admin.php';

It's safe to remove the slash that appears before admin.php, yes?

Creating a variable to control is_site_on ?

I'm trying to give the is_site_on setting the same treatment as the debug preference.

So far, in config.master.php I have added;
$env_config['is_system_on'] = (ENV_SYSTEM_ON) ? 'y' : 'n' ;

Then within config.env.php, in the appropriate CASE I have;
define('ENV_SYSTEM_ON', FALSE);

However the setting I make in config.env.php seems to be ignored and the only way to turn the site on or off is to do so within the CP.

Do you have any idea why this may be and how I could overcome it so I could set the on/off status within my environment cases?

Double-check on Require paths in config.master.php

In config.master.php, at the top and in the database section, you reference the ENV config files with no path:

require 'config.' . ENV . '.php';

But, in the config section, you use a full path:

require $_SERVER['DOCUMENT_ROOT'] . '/../config/config.' . ENV . '.php';

I just wanted to double-check: did you find that you needed to use the full path there? Or, should the pathless version always work. (Swapping that out with a pathless reference works fine for me.)

Syspath

Shouldn't line 62 in config.master.php be

$system_folder = SYSPATH . '../';
rather than
$system_folder = APPPATH . '../';

?

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.