Embeds Changes in WordPress 4.5

After the introduction of the embeds feature in WordPress 4.4 there have been a few significant changes in 4.5 to make embeds more robust and easier to customize. 🎉

Embed Code Adjustments

Tickets: #35804, #35894

There were two minor changes to the <iframe> embed code:

  1. The iframeiframe iFrame is an acronym for an inline frame. An iFrame is used inside a webpage to load another HTML document and render it. This HTML document may also contain JavaScript and/or CSS which is loaded at the time when iframe tag is parsed by the user’s browser.’s title attribute has been adjusted to better describe its content for improved accessibilityAccessibility Accessibility (commonly shortened to a11y) refers to the design of products, devices, services, or environments for people with disabilities. The concept of accessible design ensures both “direct access” (i.e. unassisted) and “indirect access” meaning compatibility with a person’s assistive technology (for example, computer screen readers). (https://en.wikipedia.org/wiki/Accessibility).
  2. The iframe is now hidden using a different technique to prevent images from not being displayed properly in Firefox, working around a known bugbug A bug is an error or unexpected result. Performance improvements, code optimization, and are considered enhancements, not defects. After feature freeze, only bugs are dealt with, with regressions (adverse changes from the previous version) being the highest priority. in that browser.

Discovery Improvements

Ticketticket Created for both bug reports and feature development on the bug tracker.: #35979

Since WordPress 4.4, oEmbed discovery has been turned on by default. Using auto discovery, WordPress tries to find embeddable content when a URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org is pasted on a new line in the editor. [36880] prevents timeouts from happening when requesting the URL by limiting the response size to 150KB.

Embedding Static Front Pages

Ticket: #34971

Previously, embedding a static front pageStatic Front Page A WordPress website can have a dynamic blog-like front page, or a “static front page” which is used to show customized content. Typically this is the first page you see when you visit a site url, like wordpress.org for example. was not possible due to not having an /embed/ endpoint. Now embed is a reserved slug that can’t be used for new pages/posts. When https://example.com/foo/embed/ is an existing page, embeds fall back to https://example.com/foo/?embed=true.

Embed Template Changes

Displays select embed template and template part locations, as well as various areas of an example embed view. Covers embed.php, the_embed_site_title(), embed-content.php, the_excerpt_embed(), and print_embed_sharing_options().

Tickets: #35322, #35630, #34561

  • The site icon in the embed template used to fall back to an image located inside /wp-admin/. This was problematic when the directory is not accessible to the public. That image is now loaded from inside /wp-includes/.
  • Thanks to an adjusted click event handler, links inside the iframe now work even when they’re inserted dynamically after the page load.
  • By far the biggest changes affect the way the embed template is loaded 💪🏽. Most notably, the old wp-includes/embed-template.php file has been deprecated and split into five new template parts that can be individually overridden by themes:
    • embed.php
    • embed-404.php
    • embed-content.php
    • headerHeader The header of your site is typically the first thing people will experience. The masthead or header art located across the top of your page is part of the look and feel of your website. It can influence a visitor’s opinion about your content and you/ your organization’s brand. It may also look different on different screen sizes.-embed.php
    • footer-embed.php

The five new template parts live in /wp-includes/theme-compat/ and allow coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. to gracefully fall back should themes prefer not to override any or all of them.

Previously, the embed template could only be changed using the embed_template filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output.. This filter can now be leveraged directly within the template hierarchy via the already-existing {$type}_template filter (where $type equals “embed”).

See get_query_template() and locate_template() for more information.

See [36693] for the relevant changeset.

Embeds in the Template Hierarchy

Ticket: #34278

In addition to the new base embed.php template and related template parts, themes can now implement embed templates for specific post types and post formats within the confines of the template hierarchy. The embeds template cascade looks like this:

  • embed-{post-type}-{post_format}.php
  • embed-{post-type}.php
  • embed.php
  • wp-includes/theme-compat/embed.php

Note that this is the first time direct theme-compat inheritance has been integrated with the template hierarchy. This approach allows core to provide basic, yet standardized templates and template parts for handling post embeds.

To leverage the core embed template parts, simply use standard get_template_part() calls within your themes. The template hierarchy will do the rest.

For example:

  • If the theme is leveraging its own version of embed.php template, it would likely call template parts directly, e.g. get_template_part( 'embed', 'content' );
  • If the theme is relying on the core embed template parts – i.e. not providing its own embed-content.php file – the template hierarchy would fall back to using wp-includes/theme-compat/embed-content.php, and so on.

See [36876] for the relevant changeset.

Note:
For more information on extending embeds within the scope of the template hierarchy, check out the new Embeds section in the Template Hierarchy reference in the Theme Developer handbook.

#4-5, #dev-notes, #embeds

Customizer Improvements in 4.5

In addition to the ~35 defects that were fixed in this release, there were also ~17 features and enhancements that were made. What follows are some highlights, starting with some smaller enhancements and then listing out full posts that document the larger features.

Setting-less Controls (#35926)

Sometimes controls need to be added which don’t directly have associated settings. For example, there can be controls needed which manipulate some aspect of the CustomizerCustomizer Tool built into WordPress core that hooks into most modern themes. You can use it to preview and modify many of your site’s appearance settings. interface or manage the behavior of other controls and their settings: consider a control for managing repeating controls, where the button only serves to create other controls and their settings. When nav menus were added in the Customizer in 4.3, the UIUI User interface for creating a new menu involved two controls which had custom settings associated them (create_new_menu and new_menu_name) which served no purpose other than to make sure the control wouldn’t raise an error. The settings had custom types to prevent them from getting saved to the DB.

In 4.5, controls are no longer required to have associated settings. By default registering a control without an explicit settings argument will result in the control’s own id being supplied as the associated setting id. To explicitly register a control without any associated settings, pass an empty array as the settings:

$wp_customize->add_control( 'new-post', array(
	'section'  => 'title_tagline',
	'settings' => array(),
	'type' => 'button',
	'input_attrs'  => array(
		'value' => __( 'Add Post' ),
	),
	'capability' => 'edit_posts',
) );

Because controls no longer require settings, controls now accept a capability argument (as seen above) whereas previously a control’s capability would depend on the capabilities of its associated settings. A control will not be displayed if it has a defined capability which the user doesn’t have, or if the user doesn’t have the capability required for any of the associated settings. If you omit the capability for a setting-less control, it will be displayed to all users (who can customize).

Other Improvements

  • Shift-click on nav menu items in preview to open corresponding control in Customizer pane (#26005).
  • Shift-click on site title and tagline for CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. themes and any that implement selective refresh partials for these settings. Focus on the control for any setting in the preview by sending a focus-control-for-setting message to the pane, passing the setting ID. This is used to focus on controls when a shift-click is done on a selective refresh partial.
  • Site title and tagline will be updated via selective refresh in core themes. (#33738)
  • WP_Customize_Manager::add_*() methods now return the added instance. (#34596)
  • WP_Customize_Manager::add_setting() now applies the relevant dynamic setting filters. (#34597)
  • There is a new customize_nav_menu_searched_items filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output. for nav menu item searches. (#34947)
  • The WP_Customize_Media_Control now allows its button_labels to be overridden. (#35542)
  • The setting models in the preview now have a id property and _dirty flag to correspond to the settings in the pane; dynamically created settings in the pane will be created in the preview. (#35616)
  • More config settings are exported to the preview to allow the preview to do more operations inline, including more nonces, the current theme, and the previewed URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org. (#35617)

Dedicated Feature Posts

Device Preview (#31195)

https://make.wordpress.org/core/2016/01/28/previewing-site-responsiveness-in-the-customizer/

Selective Refresh (#27355)

https://make.wordpress.org/core/2016/02/16/selective-refresh-in-the-customizer/

Custom Logo (#33755)

https://make.wordpress.org/core/2016/03/10/custom-logo/

#4-5, #customize, #dev-notes

Dev Chat notes for March 9

Agenda

Schedule Notes, Status Updates, Road to BetaBeta A pre-release of software that is given out to a large group of users to trial under real conditions. Beta versions have gone through alpha testing in-house and are generally fairly close in look, feel and function to the final product; however, design changes often occur as part of the process. 3 — Triagetriage The act of evaluating and sorting bug reports, in order to decide priority, severity, and other factors. Edition

Schedule Notes

  • As noted on the schedule, Beta 3 is due today!
  • @mike would like to see this report down to 50 before Beta 3 goes out. We’re at 66 at the time of the meeting, we were at 100 before the weekend.

Status Updates

  • Image Improvements: @joemcgill
    • We landed r36891 which improves the optimizations we’ve added for resizing images using Imagick. Blogblog (versus network, site) post for make/coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. will go out soon that will outline the details.
    • Only a few media related tickets left in the milestone. We’ll fix what is left or puntpunt Contributors sometimes use the verb "punt" when talking about a ticket. This means it is being pushed out to a future release. This typically occurs for lower priority tickets near the end of the release cycle that don't "make the cut." In this is colloquial usage of the word, it means to delay or equivocate. (It also describes a play in American football where a team essentially passes up on an opportunity, hoping to put themselves in a better position later to try again.) after our dev chat on Friday.
  • CustomizerCustomizer Tool built into WordPress core that hooks into most modern themes. You can use it to preview and modify many of your site’s appearance settings.: @westonruter, @celloexpressions
    • Most of the remaining Customize component issues are regarding Custom Logo. The ones that aren’t include fixes to the expansion and focusing of panels, which @kienstra are @delawski working on…
    • Selective Refresh needs QUnit tests for the Customizer preview.
    • Requested feedback on requiring theme support for widgets to employ selective refresh: #35855.
  • Theme Logo Support: @obenland
    • Finishing touches. @jorbin got tests in, the site icon control is now a little more concise, @westonruter and @obenland finishing up the headerHeader The header of your site is typically the first thing people will experience. The masthead or header art located across the top of your page is part of the look and feel of your website. It can influence a visitor’s opinion about your content and you/ your organization’s brand. It may also look different on different screen sizes. text toggle for when a theme doesn’t support custom headers.
    • Reconsider site logo control placement in customizer (#35942) ready to go
  • Editor: @azaozz, @iseulde
    • Nothing new,  test please!

Road to Beta 3 — Triage Edition

  • Bug fixing continued in core, led by @chriscct7, and reached below the 50 ticketticket Created for both bug reports and feature development on the bug tracker. goal for Beta 3! Check the full logs on #slack-core.

#4-5, #dev-chat

Comment Changes in WordPress 4.5

WordPress 4.5 includes several ancient bugbug A bug is an error or unexpected result. Performance improvements, code optimization, and are considered enhancements, not defects. After feature freeze, only bugs are dealt with, with regressions (adverse changes from the previous version) being the highest priority. fixes and a few enhancements in the Comments component. We have closed 25 tickets. Check out the full list of changes.

Moderate Comment Screen Refresh

This often neglected screen has received a UXUX User experience update. Don’t know what the “Moderate Comment” screen is? This is where you land when clicking one of the moderation actions from a comment notification email message.

Changes of note:

  • Comment content is formatted for display, instead of one massive blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. of escaped text
  • Include navigation via a text link to the Edit Comment screen at the bottom of the comment
  • Updated message styles that match other screens
  • Only wrap the comment date in a link if the comment permalink exists to avoid confusion
  • Appended #wpbody-content to the comment email message links for accessibilityAccessibility Accessibility (commonly shortened to a11y) refers to the design of products, devices, services, or environments for people with disabilities. The concept of accessible design ensures both “direct access” (i.e. unassisted) and “indirect access” meaning compatibility with a person’s assistive technology (for example, computer screen readers). (https://en.wikipedia.org/wiki/Accessibility)

Before:
34133-before
After:
34133-after

See #34133

Max Lengths for Comment Form Fields

Be verbose without having to worry that your insightful words will be lost.

The comment form will now enforce the maximum length of each field’s respective database column with hardcoded maxlength attributes. The hardcoded maxlength attributes can be adjusted for custom database schemas by using the comment_form_default_fields filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output..

The default length settings are as follows:

  • Comment: 65525 characters
  • Name : 245 characters
  • Email: 100 characters
  • Url: 200 characters

Comments will also have the input lengths checked by the new function wp_get_comment_fields_max_lengths(), and accompanying filter wp_get_comment_fields_max_lengths, upon submission returning a WP_Error object if any value is longer than its database column.

See #10377.

Comment Error Page Navigation

Previously, visitors who submitted a comment that was unable to be processed were shown an error message without a method to navigate back to their comment. Your potential commenter would have to use their browser’s back button to get back to their comment to resolve the error.

A simple back link has been added to the bottom of the error message page. See the screenshots below.

Before:
4332-before

After:
4332-after

See #4332.

Other Changes of Note

  • The rel=nofollow attribute and value pair will no longer be added to relative or same domain links within comment_content. See #11360.
  • WP_Comment_Query now supports the author_url parameter. See #36224.
  • The new pre_wp_update_comment_count_now filter allows you to bail out of updating the comment count for a given Post. See #35060

#4-5, #comments, #dev-notes

Week in Core, Mar 1 – Mar 8 2016

Welcome back the latest issue of Week in CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress., covering changes [36801-36888]. Here are the highlights:

Ticketticket Created for both bug reports and feature development on the bug tracker. numbers based on trac timeline for the period above.

Note: If you want to help write the next WordPress Core Weekly summary, check out the schedule over at make/docs and get in touch in the #core-weekly-update SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/. channel.

Continue reading

#4-5, #week-in-core

Beta 3 is Coming: Trac Ticket Owners, Please Update Your Tickets

Per the schedule, WordPress 4.5 BetaBeta A pre-release of software that is given out to a large group of users to trial under real conditions. Beta versions have gone through alpha testing in-house and are generally fairly close in look, feel and function to the final product; however, design changes often occur as part of the process. 3 will be released in the hours following today’s weekly dev meeting, which is at March 9, 2016 at 1pm PST.

There are currently 72 tickets in the milestone remaining. This is great movement from last week (thanks!), but before the release of Beta 3, I’d like to see this down to 50.

To support this, we’ll run a triagetriage The act of evaluating and sorting bug reports, in order to decide priority, severity, and other factors., starting after status reports in the dev meeting, extending afterwards for as long as folks want to stay to work on the milestone.

For next week — by Beta 4 — let’s target no more than 25 tickets in the milestone.
As a reminder, the report needs to be entirely clear before Release Candidaterelease candidate One of the final stages in the version release cycle, this version signals the potential to be a final release to the public. Also see alpha (beta). 1 (two weeks from now).

If you own ticketticket Created for both bug reports and feature development on the bug tracker.(s) on TracTrac An open source project by Edgewall Software that serves as a bug tracker and project management tool for WordPress. in the 4.5 milestone:

  • If your ticket will not be finished in the very near future, please puntpunt Contributors sometimes use the verb "punt" when talking about a ticket. This means it is being pushed out to a future release. This typically occurs for lower priority tickets near the end of the release cycle that don't "make the cut." In this is colloquial usage of the word, it means to delay or equivocate. (It also describes a play in American football where a team essentially passes up on an opportunity, hoping to put themselves in a better position later to try again.) it to Future Release.
  • If your ticket will be finished in the very near future, please add an update as to what is left as a comment on the ticket, including an estimated completion timeframe if possible.

Thanks to everyone for your help!

#4-5, #trac

Multisite Focused Changes in 4.5

Howdy! The 4.5 release cycle was relatively quiet for multisitemultisite Used to describe a WordPress installation with a network of multiple blogs, grouped by sites. This installation type has shared users tables, and creates separate database tables for each blog (wp_posts becomes wp_0_posts). See also network, blog, site, though we still managed to knock out a few good things. The following is a brief rundown of each, full details can be found in the full list of multisite focused changes for 4.5. 💫

Introduce WP_Site

The global $current_blog has always been used as a way to store the properties in a stdClass object of the current site during bootstrap. With the introduction of WP_Site, we add some definition and have a more proper object to pass around. Sweet.

Take a look at ms-settings.php if you are using a custom sunrise.php to populate the $current_blog global. We now create a WP_Site object from the existing $current_blog if it has been populated elsewhere. This is a backward compatible change, though should be tested wherever your code interacts with $current_blog, especially if anything has been done to extend its structure.

This last paragraph may sound familiar to you because I copied it from the notes on the work we did in the 4.4 release to add WP_Network as an object. In future releases, we’ll continue to build these out with query classes as well.

See #32450 for all the details.

New Actions and Filters

  • network_user_new_form fires at the end of the networknetwork (versus site, blog)’s Add New User form. #15389
  • network_site_new_form fires at the end of the network’s Add New Site form. #34739
  • network_allowed_themes and site_allowed_themes allow for more granular filtering of the themes allowed for a site. The legacy allowed_themes will continue to do its job. #28436
  • pre_network_site_pre_created_user fires right before a new user is created during the Add New Site process if one does not already exist. #33631

Other interesting things

  • Use a usermeta key rather than a site option keyed to the user ID when a user changes their email address and confirmation is needed. #23358
  • In subdomain installations, if a user attempted to login to a site they did not have access to on the network, they would be shown an access denied message with a list of authorized sites. This differed from the behavior in subdirectory installs, where the user would be redirected to either their profile page or the dashboard of their primary site. In 4.5, the subdomain behavior now matches the subdirectory behavior. #30598
  • The performance of wp_upload_dir() has been improved, specifically via persistent cache. This isn’t necessarily multisite related, though you should probably be familiar with the change. #34359
  • Show the home URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org rather than siteurl in site-info.php and use the text “Site Address (URL)” for consistency with the similar site in single site. #35632
  • Provide an “Edit user” link after adding a new user to a site or network. #35705 😻

And that’s about it. There may still be some bugbug A bug is an error or unexpected result. Performance improvements, code optimization, and are considered enhancements, not defects. After feature freeze, only bugs are dealt with, with regressions (adverse changes from the previous version) being the highest priority. fixing in the next week or so, but only if you get out there and test trunktrunk A directory in Subversion containing the latest development code in preparation for the next major release cycle. If you are running "trunk", then you are on the latest revision. against your plugins, themes, and crazy configurations. Have at it!

#4-5, #dev-notes, #multisite

Link modal (wpLink) changes in WordPress 4.5

There is a new and improved inline links dialog in the Visual Editor, see #33301. When the users type in the URLURL A specific web address of a website or web page on the Internet, such as a website’s URL www.wordpress.org field, it uses jQuery UIUI User interface Autocomplete to search for local posts and pages.

The old modal dialog (a.k.a. wpLink) is still used for “Advanced” link options. It was simplified, the infinite scrolling bottom part was removed. Now this dialog also uses UI Autocomplete on the URL field to search for posts and pages. That makes it consistent with the inline dialog and leaves more space for plugins that want to add additional settings in it.

If your pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party uses or extends wpLink, please test it now to confirm all is working properly.

#4-5, #dev-notes, #editor

Enhanced Script Loader in WordPress 4.5

This post summarizes some of the changes to the script loader and script/style dependencies in WordPress 4.5.

Individual stylesheets instead of wp-admin.min.css

Ticketticket Created for both bug reports and feature development on the bug tracker.: #35229

Currently, WordPress generates and ships relatively large 235KB wp-admin.min.css and wp-admin-rtl.min.css files which are created from source files which we also ship.
With WordPress 4.5 we stop generating these files and instead rely upon load-styles.php to combine them. This removes the requirement from shipping for commits such as [35896] 510KB of CSSCSS Cascading Style Sheets.. Instead, we only have to ship the 4 dashboard.css files which are around 72KB.

For pluginPlugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party authors nothing should change because the script loader takes care of the new dependency for the wp-admin handle. Also, wp-admin.* files are still generated for compatibility purposes, however, they only include the @import() lines.

Breaking Change: If your plugin or theme is still using the deprecated media functionality please note that in [36869] the style handle was changed from media to media-deprecated.

HTTPHTTP HTTP is an acronym for Hyper Text Transfer Protocol. HTTP is the underlying protocol used by the World Wide Web and this protocol defines how messages are formatted and transmitted, and what actions Web servers and browsers should take in response to various commands. ETag headerHeader The header of your site is typically the first thing people will experience. The masthead or header art located across the top of your page is part of the look and feel of your website. It can influence a visitor’s opinion about your content and you/ your organization’s brand. It may also look different on different screen sizes. for load-scripts.php and load-styles.php

Ticket: #28722

Both loaders for script and style concatenation are now sending an ETag header which includes the value of $wp_version. This improves performance since browsers won’t re-download the scripts and styles when they send the HTTP_IF_NONE_MATCH header and there was no change in $wp_version. ⚡️

wp_add_inline_script()

Ticket: #14853

For quite some time wp_add_inline_style() has been available to add extra CSS styles to a registered stylesheet. Now there’s an equivalent function to do the same for inline JavaScriptJavaScript JavaScript or JS is an object-oriented computer programming language commonly used to create interactive effects within web browsers. WordPress makes extensive use of JS for a better user experience. While PHP is executed on the server, JS executes within a user’s browser. https://www.javascript.com/.. wp_add_inline_script() can be used to add extra scripts either before or after a registered script using the optional third $position argument.

For example, the following code can be used to easily add Typekit’s JavaScript to your theme:

function mytheme_enqueue_typekit() {
   wp_enqueue_script( 'mytheme-typekit', 'https://use.typekit.net/<typekit-id>.js', array(), '1.0' );
   wp_add_inline_script( 'mytheme-typekit', 'try{Typekit.load({ async: true });}catch(e){}' );
}
add_action( 'wp_enqueue_scripts', 'mytheme_enqueue_typekit' );

Which results in:

<script type='text/javascript' src='https://use.typekit.net/<typekit-id>.js?ver=1.0'></script>
<script type='text/javascript'>
try{Typekit.load({ async: true });}catch(e){}
</script>

Scripts/Styles with “alias” handles

Ticket: #35643, #25247, #35229

Alias handles are handles without a $src parameter. Those can be used to group dependencies, like core is doing for jQuery[36550] changes how those handles are loaded, more specifically, they are no longer skipped early in WP_Dependencies.

Now, inline styles and scripts attached to alias handles will do something important — get printed out. This change was required by the switch to an alias handle for wp-admin to provide backwards compatibility for plugins which are adding inline styles to the wp-admin handle.

Support for scripts with dependencies in different groups

Ticket: #35873, #35873

Scripts can be registered in two groups: head or footer. Previously, dependencies of registered scripts were moved to the header, even when the script that depends on them is loaded in the footer. This was fixed in [36871]. The changeset includes some expressive tests to demonstrate how complex dependencies, like “grandchild” dependencies, can be enqueued.

Last, but not least, WP_Dependencies, WP_Styles, and WP_Scripts are now fully documented. 📘

Thanks to @abiralneupane, @atimmer, @dd32, @gitlost, @ocean90, @sebastian.pisula, @sergej.mueller, @stephenharris, and @swissspidy for their contributions!

#4-5, #dev-notes, #script-loader