Coder Social home page Coder Social logo

10up / simple-podcasting Goto Github PK

View Code? Open in Web Editor NEW
179.0 58.0 29.0 9.29 MB

A simple podcasting solution for WordPress.

Home Page: https://wordpress.org/plugins/simple-podcasting/

License: GNU General Public License v2.0

PHP 58.59% JavaScript 37.56% CSS 0.56% Shell 0.03% SCSS 3.27%
podcast wordpress wordpress-plugin apple-podcasts block blocks episode gutenberg podcasting simple-podcasting

simple-podcasting's Introduction

Simple Podcasting for WordPress

Easily set up multiple podcast feeds using built-in WordPress posts. Includes a podcast block and podcast transcript block for the WordPress block editor (aka Gutenberg).

Support Level WordPress tested up to version GPLv2 License WordPress Plugin Version

E2E Test Unit Tests PHPCS PHP Compatibility Dependency Review

Overview

Podcasting is a method to distribute audio messages through a feed to which listeners can subscribe. You can publish podcasts on your WordPress site and make them available for listeners in Apple Podcasts and through direct feed links for other podcasting apps by following these steps:

Screenshot of podcast block

Requirements

  • PHP 7.4+
  • WordPress 6.4+
  • RSS feeds must not be disabled

Installation

  1. Install the plugin via the plugin installer, either by searching for it or uploading a .zip file.
  2. Activate the plugin.
  3. Head to Posts → Podcasts and add at least one podcast.
  4. Create a post and insert an audio embed (or a podcast block in the new WordPress editor) and select a Podcast feed to include it in.

Create your podcast

From the WordPress Admin, go to Podcasts. To create a podcast, complete all of the "Add New Podcast" fields and click "Add New Podcast".

  • Name: this title appears in Apple Podcasts and any other podcast apps.
  • Slug: this is the URL-friendly version of the Name field.
  • Subtitle: the subtitle also appears in Apple Podcasts and any other podcast apps.
  • Artist / Author name: the artist or producer of the work.
  • Podcast email: a contact email address for your podcast.
  • Summary: Apple Podcasts displays this summary when browsing through podcasts.
  • Copyright / License information: copyright information viewable in Apple Podcasts or other podcast apps.
  • Mark as explicit: mark Yes if podcast contains adult language or adult themes.
  • Language: the main language spoken in the podcast.
  • Cover image: add the URL for the cover art to appear in Apple Podcasts and other podcast apps. Click "Select Image" and choose an image from the Media Library. Note that podcast cover images must be between 1400 x 1400 and 3000 x 3000 pixels in JPG or PNG formats to work on Apple Podcasts.
  • Keywords: add terms to help your podcast show up in search results on Apple Podcasts and other podcast apps.
  • Categories: these allow your podcast to show up for those browsing Apple Podcasts or other podcast apps by category.

Repeat for each podcast you would like to create.

Add content to your podcast

  • Create a new post and assign it to one or more Podcasts using the panel labeled Podcasts.
  • Upload or embed an audio file into this post using any of the usual WordPress methods. If using the new block-based WordPress editor (sometimes referred to as Gutenberg), insert a Podcast block. Only one Podcast block can be inserted per post.
  • For more advanced settings, use the Podcasting meta box to mark explicit content or closed captioning available, season number, episode number, episode type, add a transcript and to optionally specify one media item in the post if you have more than one in your post. In the block-based editor, these are the block settings that appear in the sidebar when the podcast block is selected.
  • Transcript: If desired, an optional transcript can be added from the settings of the Podcast block. This will add a Podcast Transcript block, allowing you to add a transcript consisting of time codes, citations, and paragrah text that can be embedded in the post, linked to an external plain HTML file, or linked in a special <podcast:transcript> XML element.

Submit your podcast feed to Apple Podcasts

Podcast setup Podcast in editor Podcast feed
Podcast setup Podcast in editor Podcast feed

Submit your podcast feed to Pocket Casts

How do I get my podcast featured on Pocket Casts?

The Featured section of Pocket Casts is human-curated. To ensure that all podcasts have an equal opportunity at being featured, selections are made on the basis of merit.

If you’d like to suggest your podcast for a featured spot, reach out to [email protected].

For more information, read more.

How do I submit private and paid podcast feeds?

Follow this documentation to submit private and paid podcast feeds

Control how many episodes are listed on the feed

If you want to adjust the default number of episodes included in a podcast RSS feed, then utilize the following to do so...

<?php

add_filter( 'simple_podcasting_episodes_per_page', 'podcasting_feed_episodes_per_page' );

/**
 * Filter how many items are displayed on the feed
 * Default is 250
 *
 * @param int $qty Items count.
 * @return string
 */
function podcasting_feed_episodes_per_page( $qty ) {
	return 300;
}

Customize the RSS feed title

The <title> element of the RSS feed can be adjusted using the simple_podcasting_feed_title filter.

<?php

add_filter( 'simple_podcasting_feed_title', 'podcasting_feed_update_feed_title', 10, 2 );

/**
 * Filter the name of the of the feed channel
 *
 * @param $output Output to be modified.
 * @param $term WP_Term object representing the podcast
 * @return string
 */
function podcasting_feed_update_feed_title( $output, $term ) {
	$term_name = $term->name;

	return '10up Presents: ' . $term_name;
}

Customize RSS feed

If you want to modify RSS feed items output, there is a filter for that:

<?php

function podcasting_feed_item_filter( $feed_item = array(), $post_id = null, $term_id = null ) {
	if ( 42 === $post_id ) {
		$feed_item['keywords'] = 'one,two,three';
	}
	return $feed_item;
}
add_filter( 'simple_podcasting_feed_item', 'podcasting_feed_item_filter', 10, 3 );

Support Level

Stable: 10up is not planning to develop any new features for this, but will still respond to bug reports and security concerns. We welcome PRs, but any that include new features should be small and easy to integrate and should not include breaking changes. We otherwise intend to keep this tested up to the most recent version of WordPress.

Changelog

A complete listing of all notable changes to Simple Podcasting for WordPress are documented in CHANGELOG.md.

Contributing

Please read CODE_OF_CONDUCT.md for details on our code of conduct, CONTRIBUTING.md for details on the process for submitting pull requests to us, and CREDITS.md for a listing of maintainers of, contributors to, and libraries used by Simple Podcasting for WordPress.

Like what you see?

simple-podcasting's People

Contributors

barneyjeffries avatar bmarshall511 avatar cadic avatar davidtowoju avatar dependabot[bot] avatar dinhtungdu avatar dkotter avatar faisal-alvi avatar firestorm980 avatar ggutenberg avatar github-actions[bot] avatar helen avatar iamdharmesh avatar jayedul avatar jeffpaul avatar kirtangajjar avatar kmgalanakis avatar mattheu avatar mehidi258 avatar mehul0810 avatar nateconley avatar pabamato avatar peterwilsoncc avatar psorensen avatar ryanwelcher avatar sidsector9 avatar sksaju avatar supersmo avatar turtlepod avatar zamanq 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

simple-podcasting's Issues

Gutenberg: Using the upload option instead of media library doesn't populate duration or mimetype

Describe the bug

When adding an audio file, if you choose the Upload option (or drag a file in) instead of going through the media library modal, it doesn't populate the length or mimetype. I imagine this is probably because that info is not available because it appears to insert immediately while it uploads in the background.

Steps to Reproduce

  1. Go to block editor and insert a podcast block.
  2. Click on the "upload" button and select a file or drag-and-drop a file in.
  3. Observe the immediate appearance of the audio player and no duration filled in in the sidebar.
  4. Try changing it to a file selected from the media library, even the same one, and see the duration fill in.

Expected behavior
I would expect the duration and mimetype (which isn't visible except in the podcast feed) to be populated, whether immediately based on a local file read or after it's been uploaded and processed in the library.

Screenshots
None at the moment.

Environment information

  • Device: Mac Mini
  • OS: MacOS 10.14.5
  • Browser and version: Chrome 75
  • Plugins and version: Simple Podcasting 1.1.1 in development
  • Theme and version: Twenty Nineteen
  • Other installed plugin(s) and version(s): Various

Additional context
It is actually unclear to me whether this specific flow was working previously.

Fully clear new term form after submission

I noticed the image field sticks around after submitting the form for adding a new podcast (Ajax), and it's hard to tell if it was successful because it's up at the top of the screen but you're scrolled down to the bottom. The field should be cleared of course, and I think it should probably jump you to the top of the screen after submission and before it gets inserted into the list table (if possible to time it that way).

Add transcript support for Level A Accessibility

As @timwright12 mentioned in his talk today, podcasts require a transcript to meet accessibility level A requirements.

  • Add a meta box to enter a transcript.
  • Add a link to view the transcript in the podcast feed.
  • Add an endpoint for displaying the transcript.

Podcast Image Does Not Save

When creating/editing a podcast the image field does not fill a value after having opened the media modal and choosing a selected image. Instead, the console throws an error.

simple-podcasting-image-error

After manually entering values into the database for podcasting_image_url and podcasting_image, the values are retrieved and displayed properly, but can not be edited from the Edit Podcast screen.

Categories: Saving to DB & Inserting in XML

Categories are currently saved to the database as a value of the form society-culture-personal-journals. This is then rendered in the feed XML as

<itunes:category text="society-culture-personal-journals" />

However, according to this ticket, when one has selected Society & Culture: Personal Journals, this should ultimately render to XML as

<itunes:category text="Society &amp; Culture">
    <itunes:category text="Personal Journals" />
</itunes:category>

This issue causes validation at podcastsconnect.apple.com to throw the following error…

simple-podcasts-category-error

Podcast GB block does not load or play file on WP 5.3.2

Describe the bug
On post view, preview, and blog listing pages, gutenberg podcast block does not play, no console errors shown. Time shows 0:00/0:00 and podcast doesn't load, file plays when added on the edit page. Adding conventional audio block works fine. Server php/apache error logs show no errors on day or even week of test. Tried checking what was referenced here and found the same situation: adding an audio file block has the correct src and other tags but the podcast block does not.

Steps to Reproduce

  1. Go to simple podcast plugin admin page
  2. Add new podcast
  3. Create a new post
  4. Add new podcast block
  5. Add or upload podcast file (here the podcast file should play correctly)
  6. Add new audio block
  7. add or upload audio file
  8. In right hand side menu click document, then under podcasts dropdown assign to your created podcast
  9. Click Update at the top right
  10. Click view post at the top of the page
  11. Audio block should play correctly while podcast block does not.

Expected behavior
Podcast block should load and play file much like how the audio block does

Screenshots
Annotation 2020-01-13 113832 - simple podcasting issue
Annotation 2020-01-13 113933 simple podcasting issue b

Environment information

  • Device: Dell Desktop
  • OS: Windows 10 v.1809
  • Browser and version: Chrome 79.0.3945.117
  • Plugins and version:
  • Theme and version: TwentyTwenty 1.0
  • Other installed plugin(s) and version(s):

Additional context
Information from site health

wp-core

version: 5.3.2
site_language: en_US
user_language: en_US
timezone: +00:00
permalink: /%year%/%monthnum%/%day%/%postname%/
https_status: false
user_registration: 0
default_comment_status: open
multisite: false
user_count: 1
dotorg_communication: true

wp-paths-sizes

wordpress_path: C:\wamp64\www\simple-podcasting-testing
wordpress_size: 37.84 MB (39681240 bytes)
uploads_path: C:\wamp64\www\simple-podcasting-testing/wp-content/uploads
uploads_size: 8.67 MB (9088125 bytes)
themes_path: C:\wamp64\www\simple-podcasting-testing/wp-content/themes
themes_size: 4.64 MB (4860942 bytes)
plugins_path: C:\wamp64\www\simple-podcasting-testing/wp-content/plugins
plugins_size: 436.91 KB (447399 bytes)
database_size: 708.89 KB (725901 bytes)
total_size: 52.26 MB (54803607 bytes)

wp-active-theme

name: Twenty Twenty (twentytwenty)
version: 1.0 (latest version: 1.1)
author: the WordPress team
author_website: https://wordpress.org/
parent_theme: none
theme_features: automatic-feed-links, custom-background, post-thumbnails, custom-logo, title-tag, html5, align-wide, customize-selective-refresh-widgets, editor-color-palette, editor-font-sizes, widgets, menus, editor-style
theme_path: C:\wamp64\www\simple-podcasting-testing/wp-content/themes/twentytwenty

wp-themes-inactive (3)

Twenty Nineteen: version: 1.4, author: the WordPress team
Twenty Seventeen: version: 2.2, author: the WordPress team
Twenty Sixteen: version: 2.0, author: the WordPress team

wp-plugins-active (1)

Simple Podcasting: version: 1.1.1, author: 10up

wp-plugins-inactive (2)

Akismet Anti-Spam: version: 4.1.3, author: Automattic
Hello Dolly: version: 1.7.2, author: Matt Mullenweg

wp-media

image_editor: WP_Image_Editor_GD
imagick_module_version: Not available
imagemagick_version: Not available
gd_version: bundled (2.1.0 compatible)
ghostscript_version: not available

wp-server

server_architecture: Windows NT 10.0 AMD64
httpd_software: Apache/2.4.39 (Win64) PHP/7.2.18
php_version: 7.2.18 64bit
php_sapi: apache2handler
max_input_variables: 2500
time_limit: 120
memory_limit: 256M
max_input_time: 60
upload_max_size: 2M
php_post_max_size: 8M
curl_version: 7.64.0 OpenSSL/1.1.1b
suhosin: false
imagick_availability: false
htaccess_extra_rules: false

wp-database

extension: mysqli
server_version: 5.7.26
client_version: mysqlnd 5.0.12-dev - 20150407 - $Id: 3591daad22de08524295e1bd073aceeff11e6579 $

wp-constants

WP_HOME: undefined
WP_SITEURL: undefined
WP_CONTENT_DIR: C:\wamp64\www\simple-podcasting-testing/wp-content
WP_PLUGIN_DIR: C:\wamp64\www\simple-podcasting-testing/wp-content/plugins
WP_MAX_MEMORY_LIMIT: 256M
WP_DEBUG: false
WP_DEBUG_DISPLAY: true
WP_DEBUG_LOG: false
SCRIPT_DEBUG: false
WP_CACHE: false
CONCATENATE_SCRIPTS: undefined
COMPRESS_SCRIPTS: undefined
COMPRESS_CSS: undefined
WP_LOCAL_DEV: undefined
DB_CHARSET: utf8mb4
DB_COLLATE: undefined

wp-filesystem

wordpress: writable
wp-content: writable
uploads: writable
plugins: writable
themes: writable

Specify email tag in feed

It would be nice to be able to specify googleplay:email OR itunes:email tag temporarily so that you add your feed to Google Play Music Podcast Portal. The email tag is mandatory when adding a new podcast there.

Gutenberg: external URL field no longer shows

This is pretty bad if you're trying to edit an existing external URL podcast because it leaves you without a way to cancel outside of refreshing the entire page. This seems to have happened in a relatively recent Gutenberg update.

Permalinks needed flushing

The archive and feed pages did not work for me (404) until I flushed permalinks (via visiting the Permalinks settings page).

readme updates

  • add support level section and badge
  • add version badge
  • add license badge
  • move changelog to its own file

Gutenberg: Block can be inserted more than once

Despite the useOnce option being set, I am able to insert more than one podcast block. Gutenberg still seems to respect the setting for the more tag, perhaps something has changed in naming though.

Gutenberg compatibility

There are some bugs here and the two separate and semi-hidden locations of editing related data don't really make sense to me in the way Gutenberg functions (or really generally, see #21). We need to look into whether the metabox error is a plugin problem or a Gutenberg problem and consider the right UI for managing this in Gutenberg, because I think the metabox paradigm might actually not be correct.

My suspicion is that a custom Podcast block that is mostly just an Audio block under the hood but with all those extra settings saved as post-level data would make more sense in terms of workflow, we just have to consider what happens if somebody tries to put multiple in one post. Maybe an opportunity to explore only allowing X number of blocks in a given content area in Gutenberg :)

Screenshot:

image

Gutenberg: audio player does not work in block

In the podcasting block, the player can be interacted with but does not actually seem to load or play the file, whether external URL or from the media library. The core audio block player can't even be interacted with, at least in my setup. This probably needs some more testing across browsers, etc.

Decide on PHP 5.2 compat

Currently, the plugin files use namespaces (PHP 5.3+), but the main plugin file has a class that doesn't appear to really be an object but is inherited from the originating code, which probably used the class as a pseudo-namespace. We should decide on whether 5.2 compat is necessary and, if not, remove the extraneous class.

Gutenberg: "Cancel" out of block editing mode

The edit icon allows you to change the URL or select a new podcast; however, there's no way to keep your current selection and go back to the preview mode without selecting your item all over again. There should be a cancel button and possibly also an indicator of what the current selection is so you understand that the selection hasn't been lost/won't change until you choose something else.

Gutenberg: retrieve and fill filesize, mime, and duration for external URLs

This is currently done in the classic editor on the save_post hook. It is somewhat non-performant, which is a separate issue to investigate, but for Gutenberg we should try to generate that info either upon insertion (better experience) or during update (somewhat worse, and would also need to bring that data back into Gutenberg to update the display).

Block Pattern: Latest Episode Block

Is your enhancement related to a problem? Please describe.
With the advent of Block Patterns, we might want to consider a simple block pattern to cover the Latest Episode Block concept.

Describe the solution you'd like

  • Pulls in latest episode automatically, might have some options for setting image override, etc but essentially will get all data from podcast.

Designs

TBD, but ideal to help shape what we'd craft

Describe alternatives you've considered

n/a

Additional context

Block Pattern creation walkthroughs from the super rad @melchoyce.

Podcast post meta still remains after deleting the podcast block

Describe the bug

After deleting the podcast block, the podcast meta still remains in the post meta table.
Steps to Reproduce

  1. Create a new podcast and an episode for that podcast.
  2. Edit the episode, delete the podcast block, and save changes.
  3. See the podcast meta still remains in the meta table.

Expected behavior

The podcast meta should be cleared after deleting the podcast block.

Relate #86

Should Podcast and Region continue using the default separate taxonomy post boxes?

Generally I think the workflow makes sense (set up some podcasts, write a post about the podcast and insert it, make sure the appropriate taxonomies are checked) but I wonder if the podcast selector should just be a part of the general podcasting metabox. The one thing that might change my mind is if people are frequently adding podcasts while editing a post but that doesn't seem likely to me.

Add descriptive help text for podcast fields?

I had to refer to the readme to understand what all of the fields for setting up a new podcast were, and wasn't sure which if any were required. I think it would make sense to put the help text as descriptions for the fields in the taxonomy screens as well, it makes it somewhat longer but I think it could be worth making it even easier to use.

Improve onboarding experience - (phase 1)

Right now you still need to read the docs (which are already slightly outdated) to figure out that you need to set up at least one podcast term in order for podcasting functionality to be available in the editor. We should consider the following as a better onboarding experience:

  • An admin notice if the plugin has been activated but no term has been set up yet (we should be wary of notice fatigue). This could be admin-wide or on specific pages. There is currently one on the taxonomy list/add screen.
  • Allowing a podcast term to be added while in the editor, and then handle the fact that it needs more metadata set before actually going live somehow (notice, modal to edit all those details, something else).

Other ideas?

Gutenberg: consider showing errors in block

The major use for this right now would be to indicate to the editor that a podcast term hasn't been set yet but there may be other uses for this as well, especially if we come up with a good paradigm (which could maybe even make its way back into Gutenberg or as a best practice).

Test against WP 5.4

Is your enhancement related to a problem? Please describe.
Once WordPress 5.4 is released, we'll want to test Simple Podcasting to see if any incompatibility issues arise.

Describe the solution you'd like

  • test Simple Podcasting on WP 5.4
  • open issues for any incompatibilities noted in testing
  • resolve issues identified in testing
  • bump "tested up to" version
  • if code changes needed due to incompatibilities, ship a plugin release, otherwise use "Plugin asset/readme update" action to update "tested up to" version on .org repo

Designs
n/a

Describe alternatives you've considered
none

Additional context
none

Release version 1.2.0

This issue is for tracking changes for the 1.2.0 release. Target release date: TBD July 2020.

Pre-release steps

  • IDEAL: add/update screenshot files and references in readme.txt/README.md for new functionality

Release steps

  • Branch: Starting from develop, cut a release branch named release/1.2.0 for your changes.
  • Version bump: Bump the version number in maps-block-apple.php, readme.txt, and package.json if it does not already reflect the version being released. Update both the plugin "Version:" property and the plugin MAPS_BLOCK_APPLE_VERSION constant in maps-block-apple.php.
  • Changelog: Add/update the changelog in CHANGELOG.md and readme.txt.
  • Props: update CREDITS.md with any new contributors, confirm maintainers are accurate.
  • New files: Check to be sure any new files/paths that are unnecessary in the production version are included in .gitattributes.
  • Readme updates: Make any other readme changes as necessary. README.md is geared toward GitHub and readme.txt contains WordPress.org-specific content. The two are slightly different.
  • Merge: Make a non-fast-forward merge from your release branch to develop (or merge the pull request), then do the same for develop into trunk (git checkout trunk && git merge --no-ff develop). trunk contains the latest stable release.
  • Test: Run through common tasks while on trunk to be sure it functions correctly.
  • Push: Push your trunk branch to GitHub (e.g. git push origin trunk).
  • Release: Create a new release, naming the tag and the release with the new version number, and targeting the trunk branch. Paste the changelog from CHANGELOG.md into the body of the release and include a link to the closed issues on the milestone.
  • SVN: Wait for the GitHub Action to finish deploying to the WordPress.org repository. If all goes well, users with SVN commit access for that plugin will receive an emailed diff of changes.
  • Check WordPress.org: Ensure that the changes are live on https://wordpress.org/plugins/simple-podcasting/. This may take a few minutes.
  • Close the milestone: Edit the milestone with release date (in the Due date (optional) field) and link to GitHub release (in the Description field), then close the milestone.
  • Punt incomplete items: If any open issues or PRs which were milestoned for 1.2.0 do not make it into the release, update their milestone to 1.3.0, or Future Release.

Saving & Retrieving Podcast Summary

When creating/editing a podcast the summary field does not save the value to podcasting_summary in wp_termmeta.

Also, after manually entering a value for podcasting_summary, this value is not retrieved and inserted into the textarea input on the Edit Podcast screen.

Specify podcast language

Right now the podcast feed language is set to the language of the WordPress site.

If you have a site that is set up with the language english but the podcast is in Swedish the feed information will be wrong.

Block Pattern: Post Grid Block

Is your enhancement related to a problem? Please describe.
With the advent of Block Patterns, we might want to consider a simple block pattern to cover the Post Grid Block concept.

Describe the solution you'd like

  • Output grid of episode posts with simple options for how many to render (2,4,6)

Designs

TBD, but ideal to help shape what we'd craft

Describe alternatives you've considered

n/a

Additional context

Block Pattern creation walkthroughs from the super rad @melchoyce.

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.