GithubHelp home page GithubHelp logo

maadhattah / wordpress-github-sync Goto Github PK

View Code? Open in Web Editor NEW
609.0 35.0 98.0 538 KB

A WordPress plugin to sync content with a GitHub repository (or Jekyll site)

Home Page: https://wordpress.org/plugins/wp-github-sync/

License: GNU General Public License v3.0

Shell 5.36% PHP 94.64%
wordpress-plugin

wordpress-github-sync's Introduction

WordPress <--> GitHub Sync

Contributors: JamesDiGioia, benbalter
Tags: github, git, version control, content, collaboration, publishing
Requires at least: 3.9
Tested up to: 4.8
Stable tag: 2.0.1
License: GPLv2
License URI: http://www.gnu.org/licenses/gpl-2.0.html

Description

A WordPress plugin to sync content with a GitHub repository (or Jekyll site)

Build Status Code Coverage Scrutinizer Code Quality

Ever wish you could collaboratively author content for your WordPress site (or expose change history publicly and accept pull requests from your readers)?

Looking to tinker with Jekyll, but wish you could use WordPress's best-of-breed web editing interface instead of Atom? (gasp!)

Well, now you can! Introducing WordPress <--> GitHub Sync!

WordPress <--> GitHub Sync does three things:

  1. Allows content publishers to version their content in GitHub, exposing "who made what change when" to readers
  2. Allows readers to submit proposed improvements to WordPress-served content via GitHub's Pull Request model
  3. Allows non-technical writers to draft and edit a Jekyll site in WordPress's best-of-breed editing interface

WordPress <--> GitHub sync might be able to do some other cool things:

  • Allow teams to collaboratively write and edit posts using GitHub (e.g., pull requests, issues, comments)
  • Allow you to sync the content of two different WordPress installations via GitHub
  • Allow you to stage and preview content before "deploying" to your production server

How it works

The sync action is based on two hooks:

  1. A per-post sync fired in response to WordPress's save_post hook which pushes content to GitHub
  2. A sync of all changed files triggered by GitHub's push webhook (outbound API call)

Installation

Using the WordPress Dashboard

  1. Navigate to the 'Add New' in the plugins dashboard
  2. Search for 'WordPress GitHub Sync'
  3. Click 'Install Now'
  4. Activate the plugin on the Plugin dashboard

Uploading in WordPress Dashboard

  1. Download wordpress-github-sync.zip from the WordPress plugins repository.
  2. Navigate to the 'Add New' in the plugins dashboard
  3. Navigate to the 'Upload' area
  4. Select wordpress-github-sync.zip from your computer
  5. Click 'Install Now'
  6. Activate the plugin in the Plugin dashboard

Using FTP

  1. Download wordpress-github-sync.zip
  2. Extract the wordpress-github-sync directory to your computer
  3. Upload the wordpress-github-sync directory to the /wp-content/plugins/ directory
  4. Activate the plugin in the Plugin dashboard

Installing from Source

Install the plugin and activate it via WordPress's plugin settings page.

  1. cd wp-content/plugins
  2. git clone https://github.com/benbalter/wordpress-github-sync.git
  3. cd wordpress-github-sync && composer install
  4. Activate the plugin in Wordpress' Dashboard > Plugins > Installed Plugins

Configuring the plugin

  1. Create a personal oauth token with the public_repo scope. If you'd prefer not to use your account, you can create another GitHub account for this.
  2. Configure your GitHub host, repository, secret (defined in the next step), and OAuth Token on the WordPress <--> GitHub sync settings page within WordPress's administrative interface. Make sure the repository has an initial commit or the export will fail.
  3. Create a WebHook within your repository with the provided callback URL and callback secret, using application/json as the content type. To set up a webhook on GitHub, head over to the Settings page of your repository, and click on Webhooks & services. After that, click on Add webhook.
  4. Click Export to GitHub or if you use WP-CLI, run wp wpghs export all # from the command line, where # = the user ID you'd like to commit as.

Frequently Asked Questions

Markdown Support

WordPress <--> GitHub Sync exports all posts as .md files for better display on GitHub, but all content is exported and imported as its original HTML. To enable writing, importing, and exporting in Markdown, please install and enable WP-Markdown, and WordPress <--> GitHub Sync will use it to convert your posts to and from Markdown.

You can also activate the Markdown module from Jetpack or the standalone JP Markdown to save in Markdown and export that version to GitHub.

Importing from GitHub

WordPress <--> GitHub Sync is also capable of importing posts directly from GitHub, without creating them in WordPress before hand. In order to have your post imported into GitHub, add this YAML Frontmatter to the top of your .md document:

---
post_title: 'Post Title'
layout: post_type_probably_post
published: true_or_false
---
Post goes here.

and fill it out with the data related to the post you're writing. Save the post and commit it directly to the repository. After the post is added to WordPress, an additional commit will be added to the repository, updating the new post with the new information from the database.

Note that WordPress <--> GitHub Sync will only import posts from the master branch. Changes on other branches will be ignored.

If WordPress <--> GitHub Sync cannot find the author for a given import, it will fallback to the default user as set on the settings page. Make sure you set this user before you begin importing posts from GitHub. Without it set, WordPress <--> GitHub Sync will default to no user being set for the author as well as unknown-author revisions.

Custom Post Type & Status Support

By default, WordPress <--> GitHub Sync only exports published posts and pages. However, it provides a number of hooks in order to customize its functionality. Check out the wiki for complete documentation for these actions and filters.

If you want to export additional post types or draft posts, you'll have to hook into the filters wpghs_whitelisted_post_types or wpghs_whitelisted_post_statuses respectively.

In wp-content, create or open the mu-plugins folder and create a plugin file there called wpghs-custom-filters.php. In it, paste and modify the below code:

<?php
/**
 * Plugin Name:  WordPress-GitHub Sync Custom Filters
 * Plugin URI:   https://github.com/benbalter/wordpress-github-sync
 * Description:  Adds support for custom post types and statuses
 * Version:      1.0.0
 * Author:       James DiGioia
 * Author URI:   https://jamesdigioia.com/
 * License:      GPL2
 */

add_filter('wpghs_whitelisted_post_types', function ($supported_post_types) {
  return array_merge($supported_post_types, array(
    // add your custom post types here
    'gistpen'
  ));
});

add_filter('wpghs_whitelisted_post_statuses', function ($supported_post_statuses) {
  return array_merge($supported_post_statuses, array(
    // additional statuses available: https://codex.wordpress.org/Post_Status
    'draft'
  ));
});

Add "Edit|View on GitHub" Link

If you want to add a link to your posts on GitHub, there are 4 functions WordPress<-->GitHub Sync makes available for you to use in your themes or as part of the_content filter:

  • get_the_github_view_url - returns the URL on GitHub to view the current post
  • get_the_github_view_link - returns an anchor tag (<a>) with its href set the the view url
  • get_the_github_edit_url - returns the URL on GitHub to edit the current post
  • get_the_github_edit_link - returns an anchor tag (<a>) with its href set the the edit url

All four of these functions must be used in the loop. If you'd like to retrieve these URLs outside of the loop, instantiate a new WordPress_GitHub_Sync_Post object and call github_edit_url or github_view_url respectively on it:

// $id can be retrieved from a query or elsewhere
$wpghs_post = new WordPress_GitHub_Sync_Post( $id );
$url = $wpghs_post->github_view_url();

If you'd like to include an edit link without modifying your theme directly, you can add one of these functions to the_content like so:

add_filter( 'the_content', function( $content ) {
  if( is_page() || is_single() ) {
    $content .= get_the_github_edit_link();
  }
  return $content;
}, 1000 );

Shortcodes (v >= XXXX)

If you wish to add either the bare URL or a link referencing the URL to an individual post, without editing themes, you can add a shortcode anywhere in your post;

[wpghs]

The following optional attributes can also be included in the shortcode

  • target=
    • 'view' (default) the url used will be the view URL (/blob/).
    • 'edit' the url used will be the edit URL (/edit/).
  • type=
    • 'link' (default) an anchor tag (<a>) with href set to the requested URL will be inserted.
    • 'url' the the bare requested URL will be inserted.
  • text=
    • '' (default) link text (where type='link', ignored otherwise) will be set to 'View this post on GitHub'.
    • 'text' link text (where type='link', ignored otherwise) will be set to 'text' (the supplied text).

For example,

[wpghs target='view' type='link' text='Here is my post on GitHub'] will produce a HTML anchor tag with href set to the 'view' URL of the post on GitHub, and the link text set to 'Here is my post on GitHub', i.e.

<a href="https://github.com/USERNAME/REPO/blob/master/_posts/YOURPOST.md">Here is my post on GitHub</a>

Any or all of the attributes can be left out; defaults will take their place.

Additional Customizations

There are a number of other customizations available in WordPress <--> GitHub Sync, including the commit message and YAML front-matter. Want more detail? Check out the wiki.

Contributing

Found a bug? Want to take a stab at one of the open issues? We'd love your help!

See the contributing documentation for details.

Prior Art

wordpress-github-sync's People

Contributors

ari-gold avatar ataylorme avatar benbalter avatar benlk avatar drallgood avatar egonw avatar gmays avatar jaywood avatar jonocarroll avatar kennyfraser avatar lsinger avatar maadhattah avatar mabrahamde avatar malsony avatar mikeschinkel avatar nosqlknowhow avatar pdclark avatar rsmith-fhiso avatar ruurtjan avatar wellingguzman 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wordpress-github-sync's Issues

Drafts don't save properly without a post_name

Preface:
I enabled syncing of drafts according to the instructions
https://github.com/benbalter/wordpress-github-sync#custom-post-type--status-support

Problem:
Drafts save to github as '2015-06-26-.md' without a name. The big issue here is that if I have two drafts on the same day, they keep wiping each other out. Wordpress does not assign a post_name until published.

Workaround:
From the Posts page on wordpress, you can click "quick edit" and set a "slug". This is the post_name.

Solution:
Maybe use something besides post_name if it is empty.

Export to GitHub times out

I'm getting 504 Gateway errors on Nginx trying to export my whole blog to set up the plugin. Maybe we should do this in batches via AJAX?

Also, would the GitHub endpoint support us pushing multiple files in a single call, or do we have to make an individual call for each file?

Lastly, I'm not sure the post_lock set up you have works the way you think it does. If there are two separate requests exporting at the same time, each runtime environment isn't crossing into each other, so if two different people are exporting, they can do so at the same time, regardless of whether the post_lock is set. I think it needs to be persisted somewhere, like an option or transient, that's set up and deleted before each request.

I can break these into 3 different issues; the first one is the only one I'm sure needs to be addressed.

Composer Auto-Loader Not PHP5.2 Compatible

I downloaded the plugin from WordPress.org

plugin version: 1.1.1
WordPress 4.3

I tried to install the plugin in two websites. Both of them cannot activate the plugin

When I activate the plugin, it gives error

Plugin could not be activated because it triggered a fatal error.

Warning: require_once(__DIR__/composer/autoload_real.php) [function.require-once]: failed to open stream: No such file or directory in /websiteName/wordpress/wp-content/plugins/wp-github-sync/vendor/autoload.php on line 5

Fatal error: require_once() [function.require]: Failed opening required '__DIR__/composer/autoload_real.php' (include_path='.:/opt/php52/lib/php') in /websitename.com/wordpress/wp-content/plugins/wp-github-sync/vendor/autoload.php on line 5

It was successfully activated and functions well in the website built in my laptop.

I really like your plugin after trying on my local computer, and hope that this problem can be solved.

API Cache can't save when it gets too big

Currently writing the entire cache to a single option. Looks like the row is getting to big to hold all that data, so we gotta figure out a way to save this data without killing the db.

WordPress database error:
Row size too large (> 8126).
Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help.
In current row format, BLOB prefix of 768 bytes is stored inline.
for query UPDATE `wp_options` SET `option_value`

Markdown Support

Started using this on first live website. Really nice work. ๐Ÿ‘

It will be great if there is markdown support. It may be enabled/disabled via settings.

For custom HTML in WordPress posts, we can export it as HTML only. Converting it to HTML may result is loss of HTML attributes and other info.

Redirect user away from settings page with query arg on export

Right now, if a user clicks export, they'll be left on the settings page with the query arg on it. If they refresh them page, it'll run the export again. We should redirect them back to the default settings page without the query arg so that won't happen.

PHP5.2 Support

Besides some of the closure usage, I'm not sure what else we do much that requires PHP5.3+. We should evaluate whether we can support 5.2 and make changes to do so. If we can't, there are some 5.3 features I'd love to make use of, specifically namespaces.

Support Importing Posts from GitHub

We should support importing posts created on GitHub, as long as they have the basic frontmatter added, e.g. this is an importable post:


---

---
I wrote a post.

Currently, this is not possible because the controller has gotten out of control and needs to be broken down into several pieces, so this issue includes any notes about the controller refactor.

Notes:

  • An Import and Export object should be split off from the controller.
  • Some of the post saving can be pushed down into the Post object itself.
  • We should include in the docs the default info to include in the YAML frontmatter.
  • Add unit tests as we do this

Syncing drafts

Right now, this plugin ignores drafts.

I think it might be a good idea, to also sync drafts.

Error installing WordPress GitHub Sync plugin

when i trying to install the plugin WordPress GitHub Sync i get the error
Fatal error: Class 'WordPress_GitHub_Sync_Admin' not found in C:\wamp\www\wordpress-site\wp-content\plugins\wordpress-github-sync-master\wp-github-sync.php on line 80
Call Stack

Time Memory Function Location

1 0.0021 423592 {main}( ) ..\plugins.php:0
2 0.3091 22274672 plugin_sandbox_scrape( ) ..\plugins.php:155
3 0.3107 22328264 include( 'C:\wamp\www\wordpress-site\wp-content\plugins\wordpress-github-sync-master\wp-github-sync.php' ) ..\plugins.php:153
4 0.3108 22329008 WordPress_GitHub_Sync->__construct( ) ..\wp-github-sync.php:255

i want the plugin in wordpress which shows the my code which i put in github site

Spyc doesn't appear to be maintained

We do our YAML with Spyc but a new version hasn't been cut in 2 years and the author doesn't appear to be merging PRs. Unfortunately, there aren't a lot of YAML packages out there. The only other one I've seen is Symfony's YAML. The older versions don't require php55. We'd have to test to make sure it's compatible before switching.

Cant find plugin

I cant find a plugin named "wordpress github sync" when i search for plugins? Is it removed?

Cheers

Support shared secret in the webhook itself

The GitHub API for Webhooks supports a secret per-hook. (Until recently, this didn't appear in the web UI for hook management, and was only accessible by updating the hook using the API itself.) The secret guarantees that it's your hook talking to your site, and not a forgery or error.

You could maybe just reuse the OAuth token for the hook secret? Haven't thought through the ramifications of that.

Better Webhook debugging output

Right now it returns 0 for a successful response (e.g., status codes). Would be wise, perhaps if WP_DEBUG is set, to output additional debugging details to the webhook output.

Add documentation

We'll need to document the hooks we're adding and explain how to add custom post type and unpublished post support, since they're being done with filters. Also, the documentation needs to be formatted for WordPress. I have a couple useful scripts for this here.

Bulk export failing due to deleted WP user

If I use the 'Export to GitHub' link on the settings page, I get the following error:

WordPress <--> GitHub sync error: Invalid request. Expected data to be of type "string"; value was: nil. Expected data to be of type "string"; value was: nil.

One file has been uploaded to the GitHub respository, so I've clearly got the credentials right and identified the right repository. I'm using a git checkout from today with WP 3.6.1.

I'm not sure what I can usefully do to help debug this, as I'm by no means a WordPress expert, but I'm happy to try anything that might be of assistance.

Posts and pages created on GitHub aren't imported by WordPress.

Steps to reproduce:

  1. Create a new post in _posts or a new page in the root directory.

  2. GitHub runs the webhook:

    {
        "ref": "refs/heads/master",
        "after": "e121f55fc6754e02ae8c1486b5569c3da01e6ba7",
        "before": "58d424ed967d13bc0a59e536c980ec09fd93c456",
        "created": false,
        "deleted": false,
        "forced": false,
        "compare": "https://github.com/benlk/trpi/compare/58d424ed967d...e121f55fc675",
        "commits": [
            {
                "id": "e121f55fc6754e02ae8c1486b5569c3da01e6ba7",
                "distinct": true,
                "message": "Adding a post",
                "timestamp": "2014-06-26T16:25:57-04:00",
                "url": "https://github.com/benlk/trpi/commit/e121f55fc6754e02ae8c1486b5569c3da01e6ba7",
                "author": {
                    "name": "Ben Keith",
                    "email": "[email protected]",
                    "username": "benlk"
                },
                "committer": {
                    "name": "Ben Keith",
                    "email": "[email protected]",
                    "username": "benlk"
                },
                "added": [
                    "_posts/2014-06-26-duplicate-post.html"
                ],
                "removed": [
    
                ],
                "modified": [
    
                ]
            }
        ],
        "head_commit": {
            "id": "e121f55fc6754e02ae8c1486b5569c3da01e6ba7",
            "distinct": true,
            "message": "Adding a post",
            "timestamp": "2014-06-26T16:25:57-04:00",
            "url": "https://github.com/benlk/trpi/commit/e121f55fc6754e02ae8c1486b5569c3da01e6ba7",
            "author": {
                "name": "Ben Keith",
                "email": "[email protected]",
                "username": "benlk"
            },
            "committer": {
                "name": "Ben Keith",
                "email": "[email protected]",
                "username": "benlk"
            },
            "added": [
                "_posts/2014-06-26-duplicate-post.html"
            ],
            "removed": [
    
            ],
            "modified": [
    
            ]
        },
        "repository": {
            "id": 21169984,
            "name": "trpi",
            "url": "https://github.com/benlk/trpi",
            "description": "Test repo, please ignore. Testing https://github.com/benbalter/wordpress-github-sync",
            "watchers": 0,
            "stargazers": 0,
            "forks": 0,
            "fork": false,
            "size": 0,
            "owner": {
                "name": "benlk",
                "email": "[email protected]"
            },
            "private": false,
            "open_issues": 0,
            "has_issues": true,
            "has_downloads": true,
            "has_wiki": true,
            "created_at": 1403623684,
            "pushed_at": 1403814376,
            "master_branch": "master"
        },
        "pusher": {
            "name": "benlk",
            "email": "[email protected]"
        }
    }
    
  3. Wordpress replies:

    0

  4. No new post or page.

Bulk export failing

If I use the 'Export to GitHub' link on the settings page, I get the following error:
WordPress <--> GitHub sync error: Invalid request. Expected data to be of type "string"; value was: nil. Expected data to be of type "string"; value was: nil.

Fix Translation Strings

Using a variable for translation strings generally doesn't work for most translation software. Those translation domains need to be converted to a string directly, and we should also implement some kind of build process for generating the .po files.

I have a script written in gulp, but we don't have any JS in this project, so let's see what exists out there in PHP, and include that as a composer script.

Plugin fails to activate

Any thoughts? Im running 4.2.2

Warning: require_once(DIR/composer/autoload_real.php) [function.require-once]: failed to open stream: No such file or directory in [...]/wp-content/plugins/wp-github-sync/vendor/autoload.php on line 5

Fatal error: require_once() [function.require]: Failed opening required 'DIR/composer/autoload_real.php' (include_path='.:/usr/local/php5/lib/php') in [...]/wp-content/plugins/wp-github-sync/vendor/autoload.php on line 5

Edits made in GitHub aren't successfully pushed to WordPress:

The site I have this set up at is http://test.benlk.com/ and the GH repo is https://github.com/benlk/trpi/

When I edit posts through WordPress, WPGHS pushes the edits to GitHub. However, edits on GitHub aren't pushed to WordPress.

Here's the request:

{
    "ref": "refs/heads/master",
    "after": "89c2aa73e516f5f03e905abacda30033f054982d",
    "before": "05fd0a63e34a09556a78116780f7321c36242618",
    "created": false,
    "deleted": false,
    "forced": false,
    "compare": "https://github.com/benlk/trpi/compare/05fd0a63e34a...89c2aa73e516",
    "commits": [
        {
            "id": "89c2aa73e516f5f03e905abacda30033f054982d",
            "distinct": true,
            "message": "Create wpghs-notes.html",
            "timestamp": "2014-06-24T13:54:54-04:00",
            "url": "https://github.com/benlk/trpi/commit/89c2aa73e516f5f03e905abacda30033f054982d",
            "author": {
                "name": "Ben Keith",
                "email": "[email protected]",
                "username": "benlk"
            },
            "committer": {
                "name": "Ben Keith",
                "email": "[email protected]",
                "username": "benlk"
            },
            "added": [
                "wpghs-notes.html"
            ],
            "removed": [

            ],
            "modified": [

            ]
        }
    ],
    "head_commit": {
        "id": "89c2aa73e516f5f03e905abacda30033f054982d",
        "distinct": true,
        "message": "Create wpghs-notes.html",
        "timestamp": "2014-06-24T13:54:54-04:00",
        "url": "https://github.com/benlk/trpi/commit/89c2aa73e516f5f03e905abacda30033f054982d",
        "author": {
            "name": "Ben Keith",
            "email": "[email protected]",
            "username": "benlk"
        },
        "committer": {
            "name": "Ben Keith",
            "email": "[email protected]",
            "username": "benlk"
        },
        "added": [
            "wpghs-notes.html"
        ],
        "removed": [

        ],
        "modified": [

        ]
    },
    "repository": {
        "id": 21169984,
        "name": "trpi",
        "url": "https://github.com/benlk/trpi",
        "description": "Test repo, please ignore. Testing https://github.com/benbalter/wordpress-github-sync",
        "watchers": 0,
        "stargazers": 0,
        "forks": 0,
        "fork": false,
        "size": 0,
        "owner": {
            "name": "benlk",
            "email": "[email protected]"
        },
        "private": false,
        "open_issues": 0,
        "has_issues": true,
        "has_downloads": true,
        "has_wiki": true,
        "created_at": 1403623684,
        "pushed_at": 1403632495,
        "master_branch": "master"
    },
    "pusher": {
        "name": "benlk",
        "email": "[email protected]"
    }
}

And the response:

<br />
<b>Warning</b>:  preg_match(): Compilation failed: nothing to repeat at offset 14 in <b>/home2/benkeith/test/wp-content/plugins/wordpress-github-sync/lib/post.php</b> on line <b>205</b><br />
<br />
<b>Warning</b>:  array_pop() expects parameter 1 to be array, null given in <b>/home2/benkeith/test/wp-content/plugins/wordpress-github-sync/lib/post.php</b> on line <b>206</b><br />
0

Did I misconfigure something?

Sync for Custom Post Type Only

Hi,

I want to enable sync for only custom post type. Means I don't want to sync up regular WP posts and pages but the only specific post type.

Is it possible?

Thanks.

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.