2025 Year in Review ๐Ÿ”— **Source:** [2025 Year in Review](https://www.youtube.com/watch?v=M7p4GFbugP0) > [!note]+ Document Notes > tags: [accessibility, wordpress, year-in-review] > author: Accessibility Checker > source: YouTube > reference: https://www.youtube.com/watch?v=M7p4GFbugP0 > date created: 2024-12-27 11:30 > > # ๐Ÿท๏ธ Title: Accessibility Checker 2025 Year in Review - Major Releases, Features, and Technical Improvements > <!-- deep-read:sections start --> ## ๐Ÿงฐ Action Inbox - [H1] Download MultiSite plugin for agency license holders โ€” manage 20+ sites efficiently #multisite - [H2] Try Archive WP for outdated content compliance โ€” maintain accessibility while archiving #archive - [H3] Update to latest version for internationalization support โ€” now available in 30+ languages #i18n ## ๐Ÿงญ Table of Contents - [๐Ÿ“ Summary](#-summary) - [๐Ÿ“– Main Content](#-main-content) - [๐Ÿ—’๏ธ Notes](#๏ธ-notes) - [๐Ÿ“š References](#-references) - [๐Ÿ—ฃ๏ธ Paraphrase](#๏ธ-paraphrase) - [๐Ÿ“ฐ Newsletter](#-newsletter) - [โœ… Action Items](#-action-items) - [๐Ÿงช Hypotheses](#-hypotheses) - [๐Ÿ“Š Methodology](#-methodology) - [โ“ Questions](#-questions) - [๐Ÿ”ฎ Future Research](#-future-research) - [๐Ÿ’ก Implications](#-implications) - [๐Ÿง  Learning Styles Assessment](#-learning-styles-assessment) - [๐Ÿ“Š Accessibility Assessment](#-accessibility-assessment) - [๐ŸŒ DEIB Assessment](#-deib-assessment) - [โœ… Logical Validity](#-logical-validity) - [๐Ÿ›ก๏ธ DARVO Analysis](#-darvo-analysis) - [๐ŸŽฏ Conclusion](#-conclusion) ### ๐Ÿ”— References - [Accessibility Checker Plugin](https://accessibilitychecker.com) - [European Accessibility Act](https://ec.europa.eu/social/main.jsp?catId=1202) ## ๐Ÿ“ Summary - Accessibility Checker released two new plugins in 2024: MultiSite management and Archive WP - Implemented full internationalization with 30+ language translations - Migrated from hybrid PHP/JavaScript scanning to full JavaScript rendering for enhanced accuracy - Added archive page scanning capabilities, performance optimizations, and WP-CLI integration - Demonstrated significant growth in non-English speaking markets, particularly Germany and Asia ## ๐Ÿ“– Main Content The Accessibility Checker team completed their most ambitious year yet, launching two standalone plugins while significantly expanding their core accessibility scanning capabilities. The MultiSite plugin addresses enterprise needs by centralizing license management across WordPress networks, while Archive WP helps organizations maintain accessibility compliance for outdated content through automated archiving with proper disclaimers and redirects. A major technical milestone was the complete internationalization of their plugin suite, making accessibility tools available in over 30 languages. This initiative required overcoming complex challenges with JavaScript string extraction and minified code translation, but resulted in measurable adoption increases in non-English markets. The team also completed a fundamental architectural shift from static PHP analysis to full JavaScript page rendering, dramatically improving scan accuracy at the cost of increased resource usage. This change enables detection of dynamically generated accessibility issues that static analysis cannot identify. ## ๐Ÿ—’๏ธ Notes #### โฑ๏ธ [00:00](https://youtu.be/M7p4GFbugP0?t=0) โ€” Welcome and Overview - Key idea: Final livestream of 2024 reviewing major accomplishments - Evidence: "Last one of the year. We made it." #### โฑ๏ธ [03:30](https://youtu.be/M7p4GFbugP0?t=210) โ€” MultiSite Plugin Release - Key idea: First major plugin release enables centralized license management - Evidence: "Allows users to basically have full control over how their licenses get applied across a multi network" #### โฑ๏ธ [08:15](https://youtu.be/M7p4GFbugP0?t=495) โ€” Settings Synchronization Feature - Key idea: Copy settings from master site to all subsites with one click - Evidence: "Why would you configure 50 different sites when you can just come here, configure one, and then clone your settings across all of them?" #### โฑ๏ธ [12:45](https://youtu.be/M7p4GFbugP0?t=765) โ€” Archive WP Plugin Introduction - Key idea: Standalone plugin for managing archived content while maintaining compliance - Evidence: "Plugin to help you manage outdated content while maintaining accessibility compliance" #### โฑ๏ธ [18:20](https://youtu.be/M7p4GFbugP0?t=1100) โ€” AI-Assisted Development - Key idea: Archive WP was first major plugin built using AI workflow - Evidence: "Archive WP was probably the first big plugin that we tried to implement that to its fullest" #### โฑ๏ธ [25:10](https://youtu.be/M7p4GFbugP0?t=1510) โ€” Internationalization Implementation - Key idea: Full translation support added across all plugins in 30+ languages - Evidence: "We fully tackled internationalization of our plugins this year" #### โฑ๏ธ [28:45](https://youtu.be/M7p4GFbugP0?t=1725) โ€” Translation Impact on Adoption - Key idea: Significant increase in installs from Germany and Asian countries - Evidence: "Germany being probably the top country that we've seen the most adoption from after implementing this internationalization" #### โฑ๏ธ [32:15](https://youtu.be/M7p4GFbugP0?t=1935) โ€” JavaScript Translation Challenges - Key idea: Minified JavaScript required special handling for translation strings - Evidence: "When that code has been minified or uglified, it's really quite difficult to discover where those strings are" #### โฑ๏ธ [38:30](https://youtu.be/M7p4GFbugP0?t=2310) โ€” Archive Page Scanning - Key idea: Five-year requested feature finally implemented using virtual post IDs - Evidence: "Steve had the idea of why can't we just virtually create these IDs" #### โฑ๏ธ [42:20](https://youtu.be/M7p4GFbugP0?t=2540) โ€” Performance Optimizations - Key idea: Query optimizations provide 5-20x speed improvements for large sites - Evidence: "For large sites, you're looking at five, six, 7, 10, 20 times faster sites for very very large sites" #### โฑ๏ธ [45:15](https://youtu.be/M7p4GFbugP0?t=2715) โ€” WP-CLI Integration - Key idea: Command-line tools enable hosting partner integrations - Evidence: "Programmatic way of getting the individual scan stats for a single page" #### โฑ๏ธ [52:30](https://youtu.be/M7p4GFbugP0?t=3150) โ€” Rule Improvements and Severity - Key idea: Enhanced rule descriptions and intelligent severity sorting - Evidence: "Improved rule descriptions and metadata to provide better context on accessibility issues" #### โฑ๏ธ [58:45](https://youtu.be/M7p4GFbugP0?t=3525) โ€” JavaScript Migration Rationale - Key idea: Full JavaScript rendering provides dramatically more accurate results than static analysis - Evidence: "It is literally the difference between making an educated guess and actually being able to see what the thing is going to look like" #### โฑ๏ธ [62:15](https://youtu.be/M7p4GFbugP0?t=3735) โ€” Custom Rule Development - Key idea: Most rules are custom extensions beyond standard Axe Core implementation - Evidence: "We only actually take directly verbatim from Axe core, a handful, maybe five or six of those rules" ## ๐Ÿ“š References - [Accessibility Checker MultiSite Plugin](https://accessibilitychecker.com/multisite) - [Archive WP Plugin](https://accessibilitychecker.com/archive-wp) - [Axe Core Accessibility Engine](https://github.com/dequelabs/axe-core) - [WP-CLI Documentation](https://wp-cli.org/) ## ๐Ÿ—ฃ๏ธ Paraphrase - Released two major plugins this year: MultiSite for enterprise license management and Archive WP for compliant content archiving with automated workflows and accessibility disclaimers - Completed full internationalization supporting 30+ languages, overcoming technical challenges with JavaScript minification and seeing significant adoption growth in non-English markets - Migrated from static PHP analysis to full JavaScript page rendering, dramatically improving accuracy while requiring more resources but enabling detection of dynamic accessibility issues ## ๐Ÿ“ฐ Newsletter **Accessibility Checker Wraps 2024 with Major Plugin Releases and International Expansion** The Accessibility Checker team completed an ambitious 2024 with two new plugin releases and significant technical improvements. The MultiSite plugin streamlines license management across WordPress networks, while Archive WP helps maintain compliance when archiving outdated content. A major milestone was full internationalization support in 30+ languages, driving notable growth in German and Asian markets. The team also migrated to JavaScript-based scanning for dramatically improved accuracy. Key practical benefits include archive page scanning (a 5-year requested feature), performance improvements up to 20x faster for large sites, and WP-CLI integration for hosting partners. Resources: [Accessibility Checker](https://accessibilitychecker.com), [WP-CLI](https://wp-cli.org/), [WCAG Guidelines](https://www.w3.org/WAI/WCAG21/quickref/) ## โœ… Action Items #### WordPress - Core: Integrate accessibility scanning into core development workflows - Plugins: Review accessibility compliance for plugin directory submissions - Community: Promote accessibility checker adoption at WordCamps and meetups - Training: Develop accessibility curriculum incorporating automated scanning tools - Documentation: Update accessibility handbook with latest scanning techniques #### DevRel - Developer advocacy: Present accessibility automation talks at conferences - Education: Create workshops on JavaScript-based accessibility scanning - Developer experience: Improve API documentation for WP-CLI commands - Community management: Moderate accessibility discussions and feedback #### OSPO - Security Management: Review accessibility scanning tool vulnerabilities - Software Inventory: Include accessibility tools in SBOM strategy - Developer Support: Provide training on accessibility compliance automation - Community Engagement: Fund accessibility tool development ## ๐Ÿงช Hypotheses - JavaScript-based scanning will become the industry standard over static analysis due to accuracy improvements - International accessibility regulations will drive increased adoption of automated scanning tools - AI-assisted development can accelerate feature delivery while maintaining code quality - Centralized license management becomes critical as organizations scale accessibility compliance efforts ## ๐Ÿ“Š Methodology - Compare install growth rates pre/post internationalization by geographic region - Measure scan accuracy improvements between PHP static analysis and JavaScript rendering - Track development velocity metrics for AI-assisted versus traditional coding approaches - Analyze performance improvements across different site sizes and configurations ## โ“ Questions - How will emerging AI coding tools change accessibility scanner development workflows? - What scanning capabilities should be prioritized as WordPress moves toward full-site editing? - How can automated accessibility tools better integrate with content creation workflows? ## ๐Ÿ”ฎ Future Research - FSE template scanning implementation strategies - Direct URL scanning versus WordPress post-based architecture - AI-powered rule creation and customization capabilities - Real-time accessibility monitoring during content editing ## ๐Ÿ’ก Implications - Practice: JavaScript-based scanning requires more server resources but provides enterprise-level accuracy - Policy: International accessibility laws create market demand for multilingual scanning tools - Security: WP-CLI integration enables secure programmatic license management for hosting providers - Education: AI-assisted development requires new code review and quality assurance processes - Funding: Accessibility tool development increasingly viable as compliance requirements expand globally ## ๐Ÿง  Learning Styles Assessment Reading level estimate: 12th grade #### ๐Ÿ‘€ Visual learners - Present: Plugin interface screenshots, workflow diagrams - Improve: Architecture diagrams for JavaScript scanning pipeline, internationalization process flowcharts #### ๐Ÿ”Š Aural learners - Present: Live stream format with developer discussion - Improve: Audio-only podcast version, technical deep-dive recordings #### ๐Ÿ—ฃ๏ธ Verbal learners - Present: Clear explanations of technical concepts, development analogies - Improve: Glossary of accessibility scanning terminology #### ๐Ÿงฉ Kinesthetic learners - Present: Live plugin demonstrations, hands-on feature testing - Improve: Step-by-step setup guides, interactive scanning tutorials #### ๐Ÿง  Logical learners - Present: Technical decision rationale, performance metrics - Improve: Decision trees for scanning method selection, ROI calculators #### ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘ Social learners - Present: Live Q&A format, community feedback integration - Improve: User story sharing, case study discussions #### ๐Ÿง˜โ€โ™€๏ธ Solitary learners - Present: Detailed technical documentation, self-paced exploration - Improve: Individual assessment tools, reflection prompts #### ๐ŸŒฟ Naturalistic learners - Present: Real-world accessibility impact examples - Improve: Ecosystem thinking about accessibility tool adoption ## ๐Ÿ“Š Accessibility Assessment #### Screen reader semantics - Present: Clear heading structure, logical content flow - Improve: More descriptive alt text for technical diagrams #### Keyboard navigation - Present: Standard video player controls - Improve: Timestamped navigation shortcuts #### Contrast and readability - Present: High contrast video player interface - Improve: Transcript formatting for better readability #### Media and captions - Present: Full video content with detailed transcript - Improve: Professional captioning, audio descriptions for visual elements #### Standards reference - Meets WCAG 2.1 AA for video content with comprehensive transcript ## ๐ŸŒ DEIB Assessment #### Cultural breadth - Present: Discussion of international market expansion, multiple language support - Improve: More diverse geographic examples, non-Western accessibility perspectives #### Inclusive language - Present: Technical jargon appropriately defined - Improve: Plain language summaries for non-technical audiences #### Neurodiversity support - Present: Clear section breaks, logical information flow - Improve: Visual summaries, reduced cognitive load formatting #### Representation - Present: Focus on making tools accessible to global audiences - Improve: Highlight diverse accessibility needs and use cases ## โœ… Logical Validity #### Strong reasoning - Deductive strength: JavaScript scanning accuracy claims supported by technical evidence - Inductive strength: Market expansion patterns based on internationalization data - Causal reasoning: Clear connection between feature releases and user adoption - Analogical strength: Appropriate comparisons to enterprise accessibility tools #### Fallacies - Post hoc reasoning: Attribution of growth to internationalization without controlling for other factors - Appeal to popularity: Using install numbers as primary quality indicator #### Tone of voice - Overall tone: Professional and technical with appropriate enthusiasm for achievements ## ๐Ÿ›ก๏ธ DARVO Analysis - Deny: No denial patterns present - Attack: No attacks on critics or competitors - Reverse victim/offender: No victim/offender reversals identified - Emotional cues: Positive, achievement-focused presentation without defensive rhetoric ## ๐ŸŽฏ Conclusion Accessibility Checker's 2024 achievements demonstrate the maturation of WordPress accessibility tooling from basic compliance checking to enterprise-grade auditing capabilities. The successful internationalization effort and technical migration to JavaScript-based scanning position the platform for continued growth as global accessibility regulations expand. The integration of AI development workflows and hosting partner APIs suggests the accessibility scanning market is evolving toward more automated, integrated solutions that reduce the technical barrier for organizations pursuing compliance. ## ๐Ÿงฑ Refactor Appendix ### ๐Ÿ“š Literature Split Pad ### [H1] MultiSite plugin centralizes accessibility management across networks > [!quote] [2025 Year in Review](https://youtu.be/M7p4GFbugP0) by [[Accessibility Checker]] via [[YouTube]]. Published 2024-12-27. Accessed 2024-12-27. > "Allows users to basically have full control over how their licenses get applied across a multi network." Critical for agencies managing multiple WordPress installations with accessibility requirements. [view highlight](https://youtu.be/M7p4GFbugP0?t=210#H1) #xref #accessibility #multisite ID:rw_multisite_management ### [H2] JavaScript scanning provides dramatically better accuracy than static analysis > [!quote] [2025 Year in Review](https://youtu.be/M7p4GFbugP0) > "It is literally the difference between making an educated guess and actually being able to see what the thing is going to look like." Fundamental shift in automated accessibility scanning methodology toward live page rendering. [view highlight](https://youtu.be/M7p4GFbugP0?t=3525#H2) #xref #scanning #javascript ID:rw_js_scanning_accuracy --- ## Full Transcript [00:05] All right, we are live.<br>[00:10] Hey,<br>[00:10] >> how's it going, William?<br>[00:12] >> Yeah, going good.<br>[00:16] >> Last one of the year.<br>[00:17] >> Last one of the year. We made it. All<br>[00:19] right.<br>[00:21] Looks like we are live on YouTube.<br>[00:27] uh<br>[00:29] check out X and see if we're live there<br>[00:31] as well.<br>[00:37] And it looks like we are live. All<br>[00:40] right, I'm going to I'm going to repost<br>[00:42] this.<br>[00:48] We're live. Today we are talking about<br>[00:52] the year in review. We made it, William.<br>[00:54] It's December. How do you feel?<br>[00:57] >> Tired.<br>[00:58] >> Tired.<br>[01:00] >> It's been a long year.<br>[01:02] >> Long year of long year of feature<br>[01:04] updates on the accessibility checker.<br>[01:07] >> Yeah. Feature updates and you know, a<br>[01:10] bunch of other things.<br>[01:11] >> Yeah.<br>[01:12] >> Nonaccessibility checker things.<br>[01:14] >> Non life raising children.<br>[01:18] >> Yeah. Just pretend that doesn't happen.<br>[01:20] That's probably the hardest part of<br>[01:21] everyone's life.<br>[01:23] >> Yeah. Yeah. Cool. Well, it looks like<br>[01:26] everything's going out.<br>[01:30] So, yeah. So, welcome to the live<br>[01:32] stream. If anybody's joining or watching<br>[01:34] after the fact, uh we appreciate it. Um<br>[01:38] we are going to take a little bit of a<br>[01:40] uh look back. You know, it's kind of<br>[01:42] like those old sitcoms, right? Where<br>[01:44] they would have that episode that was<br>[01:46] like the flashback episode,<br>[01:47] >> the filler episode,<br>[01:48] >> the<br>[01:51] what I mean.<br>[01:54] Yeah, the filler episode. Don't call us<br>[01:56] out. It's not a filler episode. This<br>[01:58] episode is going to be packed with all<br>[02:00] kinds of helpful information about<br>[02:03] accessibility checker and what we did<br>[02:06] this year and and kind of uh the the uh<br>[02:09] struggles,<br>[02:10] a little bit of the uh how the sausage<br>[02:12] is made for the year. Um but yeah, so<br>[02:16] this is going to be our flashback<br>[02:18] episode, our<br>[02:20] our greatest hits of the year. So,<br>[02:24] well, we're glad that you're you're<br>[02:25] joining. If if you're not aware, we we<br>[02:28] have this uh live stream every couple<br>[02:32] weeks and we talk about new features and<br>[02:36] uh thing upcoming features and changes<br>[02:38] to the accessibility checker. And this<br>[02:41] is intended to be a little bit of a<br>[02:43] technical uh deep dive, but also a<br>[02:45] little bit of an informative uh live<br>[02:48] stream for users of accessibility<br>[02:50] checker or potential users of<br>[02:52] accessibility checker.<br>[02:54] Accessibility checker is a WordPress<br>[02:56] plug-in that is an automated<br>[02:58] accessibility uh scanner to help you<br>[03:02] identify uh accessibility issues on your<br>[03:06] website and fix those accessibility<br>[03:08] issues.<br>[03:11] So,<br>[03:13] what do you think, William? We jump<br>[03:15] right into the year and review. So, I<br>[03:18] >> Yeah,<br>[03:19] >> I thought we would start with kind of<br>[03:21] the the big hitters, right? Like some of<br>[03:24] the major things we did this year. So,<br>[03:26] it wasn't just<br>[03:28] um<br>[03:30] it wasn't just fixing bugs, squashing<br>[03:33] bugs, and creating new features and<br>[03:35] accessibility checker. actually released<br>[03:37] two new plugins this year. Uh do you<br>[03:41] want to talk about the first one?<br>[03:43] >> Yeah, so the first plugin we released<br>[03:45] this year was the multi-sight plugin. It<br>[03:48] allows users to basically have full<br>[03:51] control over how their licenses get<br>[03:53] applied across a multi network. Um some<br>[03:57] users might have you know five site<br>[04:00] license but a network that contains<br>[04:02] seven sites. they get to prioritize<br>[04:04] which site get those license and you<br>[04:07] know when I say five sites that might<br>[04:09] not be<br>[04:10] that may not be so troublesome to visit<br>[04:12] each site individually and apply your<br>[04:15] license but when we're talking about<br>[04:16] license sizes that reach you know 50<br>[04:19] licenses<br>[04:21] people are not going to want to manually<br>[04:22] go to all of those sites. So primary<br>[04:25] reason for this plugin is management of<br>[04:28] the licenses. Um as a side benefit all<br>[04:32] the things that are required to rig up<br>[04:34] to manage licenses also allows you to<br>[04:37] see all of the errors and warnings<br>[04:38] across the entire network as well. So in<br>[04:42] addition to managing your licenses, you<br>[04:43] can also see the current stats of all of<br>[04:46] these sites in the network. Um you don't<br>[04:49] need to have the license activated on<br>[04:51] all of these sites to get stats.<br>[04:53] Obviously, we have the free plugin that<br>[04:55] runs completely without a license and<br>[04:57] has full scan, all the same rules, all<br>[05:00] bu.<br>[05:01] So, all of the site stats will be<br>[05:04] available to see in this plug-in in<br>[05:07] addition to managing the license. Um,<br>[05:10] and while you're managing the license,<br>[05:11] you're also if you have if you have the<br>[05:14] professional single site license, you<br>[05:16] get the plugin, the pro plugin, but on<br>[05:19] higher tiers, you get access to some of<br>[05:21] these add-ons. And we, you know, again,<br>[05:24] all the things that were required to be<br>[05:25] rigged up to manage the licenses meant<br>[05:28] that we could also manage all of these<br>[05:30] add-ons all from this one single page.<br>[05:38] >> Yeah. And uh that is a great<br>[05:42] explanation.<br>[05:43] Also settings. Did you mention settings<br>[05:45] about<br>[05:46] >> I did not mention settings. So why would<br>[05:48] you configure 50 different sites when<br>[05:50] you can just come here, configure one,<br>[05:52] and then clone your settings across all<br>[05:53] of them?<br>[05:54] >> Yeah. Yeah.<br>[05:55] >> So this is probably<br>[05:57] I haven't actually used this feature<br>[05:58] myself. I think this probably saved a<br>[06:00] few people many many hours of time.<br>[06:03] >> Yeah. Yeah. Yeah. So you can basically<br>[06:06] you can choose a uh a network default<br>[06:09] site any site on your WordPress<br>[06:11] multi-ite as the default.<br>[06:14] We have a a drop down to choose which<br>[06:17] site and then you can select the other<br>[06:21] sites and then you can choose copy<br>[06:23] settings from the default site and you<br>[06:25] apply that. It's actually going to set<br>[06:28] take all the settings take the settings<br>[06:30] from that one master site and and copy<br>[06:33] it to all the the other subsites.<br>[06:37] So yeah, so this is a very uh uh very<br>[06:41] awesome plugin for people managing large<br>[06:46] networks for agencies and this is an<br>[06:49] add-on plugin to that uh to the agency<br>[06:54] customer level plan for accessibility<br>[06:57] checker.<br>[06:59] >> So users with what 20 licenses<br>[07:03] >> Yeah. Yeah. Yeah. Yeah. So<br>[07:05] >> you're not going to want to visit 20<br>[07:07] individual sites in a network,<br>[07:09] >> right? And a little bit of a teaser for<br>[07:12] like things to come. We we have had some<br>[07:14] internal talks about bringing some of<br>[07:17] this uh being able to export and import<br>[07:20] settings uh to the uh accessibility<br>[07:23] checker pro plugin um for people that<br>[07:26] are setting up large networks of sites<br>[07:30] that are not inside of a multi-sight<br>[07:31] install. So trying to bring that feature<br>[07:34] to our our our premium pro plugin as<br>[07:38] well. Cool. So that's multicide.<br>[07:41] Anything else on that?<br>[07:43] >> Um I don't think so. I think this covers<br>[07:45] all the features. It doesn't have a lot<br>[07:47] of features of its own. It just takes<br>[07:49] advantage of features of, you know, all<br>[07:52] of the individual network sites.<br>[07:54] >> Yeah. Yeah. Totally.<br>[07:57] And we released this plugin early in the<br>[07:59] year. We actually started it uh I think<br>[08:03] late last year and then of course we<br>[08:05] went through development and by the time<br>[08:07] we got everything ready to launch it was<br>[08:09] it was the new year. I think we launched<br>[08:10] this in January.<br>[08:12] >> Wow. That long ago.<br>[08:14] >> Yeah. So any any of our current agency<br>[08:18] uh license holders uh if you haven't<br>[08:21] tried it and you're running a<br>[08:22] multi-sight uh give it a try. Um, so the<br>[08:27] next big feature, so we mentioned this<br>[08:29] in our last live stream. So we'll kind<br>[08:32] of just touch on it here and not go too<br>[08:34] deep, but the uh the next plugin we<br>[08:38] released is actually not an an<br>[08:40] accessibility checker add-on. Sure, it's<br>[08:42] complimentary to accessibility checker<br>[08:44] because it's kind of accessibility<br>[08:46] adjacent. Um, is the archive WP plugin.<br>[08:50] This is a premium only standalone plugin<br>[08:54] that doesn't require accessibility<br>[08:56] checker. Um, and it is a a plugin to<br>[09:00] help you manage outdated content while<br>[09:02] maintaining accessibility accessibility<br>[09:05] compliance.<br>[09:06] Um, so has a lot of features in it like<br>[09:10] where you can you can take your post and<br>[09:12] migrate them to a a custom post type<br>[09:15] called archived content and um it'll<br>[09:19] store all the metadata all it'll migrate<br>[09:21] the terms to a a new taxonomy so that<br>[09:24] you can have frontend views to filter<br>[09:26] those. It'll automatically assign uh 301<br>[09:29] redirects. Um, you can act you can<br>[09:32] revert these changes as well. If you<br>[09:34] migrate a post and you realize that, oh,<br>[09:38] I shouldn't have done that. You can<br>[09:39] actually restore that to its original<br>[09:41] location. And by location, I mean its<br>[09:43] original custom post type and its<br>[09:45] taxonomies will be restored to their<br>[09:48] original location as long as those<br>[09:50] taxonomies uh still exist. Um, but not<br>[09:55] only is it utilitarian in that in that<br>[09:57] way that it gives you this tool to<br>[09:59] migrate between these custom post types,<br>[10:02] it also comes with a full set of blocks<br>[10:05] and patterns to help you help you create<br>[10:08] the front-end page. So, we have three<br>[10:10] blocks in there uh uh for for the uh<br>[10:14] there's a disclaimer. So, this is for<br>[10:16] accessibility compliance labeling your<br>[10:18] content as archived content. Um, and<br>[10:23] just a little side note on that and the<br>[10:25] reason why you would want to archive<br>[10:27] content from an accessibility standpoint<br>[10:29] is uh a lot of a lot of u a lot of laws<br>[10:34] and regulations around accessibility<br>[10:36] will allow for an exclusion of archived<br>[10:38] content. So if you label content as<br>[10:42] archived and you don't update it after<br>[10:44] that fact um that it can be considered<br>[10:48] archived content and and it may be<br>[10:50] excluded from certain accessibility<br>[10:53] requirements.<br>[10:54] Um so we've got these blocks. So we got<br>[10:56] a disclaimer block uh in there. We've<br>[11:00] got a uh a filters block which holds all<br>[11:03] the the filters. So you can filter by<br>[11:05] the custom post type. You can filter by<br>[11:07] the original custom post type. You can<br>[11:09] filter by the uh migrated terms and uh<br>[11:13] you can filter by a search keyword<br>[11:16] search and and then there's a third<br>[11:18] block uh which is actually the loop<br>[11:20] output which is a dynamic it's it's<br>[11:23] dynamic you know um dynamically loaded<br>[11:26] content that loads uh your loop and it<br>[11:29] loads it real fast and it refreshes<br>[11:31] without a page refresh and um and then<br>[11:34] we've taken those blocks and we've given<br>[11:36] you a couple patterns as well so that<br>[11:39] you can apply this directly to a page<br>[11:41] with just one click of a button. You've<br>[11:43] got this pattern for like a left align<br>[11:45] layout or a right align layout and or a<br>[11:49] actually we remove the right align<br>[11:51] layout. Sorry, the left align layout and<br>[11:53] the center align layout um because it<br>[11:57] really doesn't make sense to put filters<br>[11:59] on the right hand side and it causes<br>[12:02] some weird you know flow issues for<br>[12:05] >> index. Yeah.<br>[12:07] Yeah, totally. And uh so the the archive<br>[12:11] WP plugin is is a fullfeatured plugin to<br>[12:15] help you manage archived content. And we<br>[12:17] worked really hard on this in October.<br>[12:21] Uh William and I were uh just are<br>[12:24] getting carpal tunnel from all the<br>[12:27] typing or all the prompting.<br>[12:31] >> I think you did an awful lot of<br>[12:32] prompting on this one. By the day I came<br>[12:35] in, I had to clean up some of that<br>[12:37] prompt work.<br>[12:38] >> Well, you know, that's an interesting<br>[12:39] take, right? So, we've<br>[12:42] uh kind of the history of accessibility<br>[12:44] checker is that, you know, accessibility<br>[12:45] checker is getting ready to turn five<br>[12:47] years old. So, next year, accessibility<br>[12:50] checker will go to kindergarten.<br>[12:52] Um, we've raised<br>[12:56] um and and five years ago, you know, AI<br>[13:00] was not part of our development<br>[13:01] workflows. Not at all. I mean it it<br>[13:04] didn't exist. Open AAI may have just<br>[13:06] been a a comp a recently founded company<br>[13:10] at that time. Um, so you know, we used<br>[13:14] to write every line of code by hand and<br>[13:16] uh nowadays we've got a lot of AI<br>[13:19] implemented in our workflows and I think<br>[13:21] the archive WP was probably the first<br>[13:24] big plug-in that we uh tried to<br>[13:28] implement that to to its fullest with<br>[13:31] without going down the the road of vibe<br>[13:35] coding which you're not going to you're<br>[13:37] never going to get uh to<br>[13:39] >> I don't see people making viable<br>[13:41] products. No.<br>[13:42] >> Yeah. With five coin. Maybe maybe next<br>[13:44] year.<br>[13:45] >> Yeah. Yeah. Yeah.<br>[13:47] >> So, we call it what do we call it? We<br>[13:49] call it pain prompting. Is that what we<br>[13:50] call it?<br>[13:53] >> I think it was a bit painful sometimes.<br>[13:55] Although, to be fair, the AI<br>[13:58] >> built a lot of things that might have<br>[14:00] been quite complicated for a human.<br>[14:02] >> Yeah.<br>[14:03] >> In this in this plug-in and it did<br>[14:05] require cleanup. I don't think the AI is<br>[14:07] quite at the point where it writes fully<br>[14:09] production ready code. someone is still<br>[14:12] going to have to follow behind. you<br>[14:14] know, where it's it's kind of<br>[14:16] interesting like with the archive WP<br>[14:19] plugin how uh<br>[14:22] the the AI would lead to discovery in<br>[14:26] some sense where you would you would you<br>[14:28] would kind of ask you use the ask<br>[14:30] feature to ask questions about<br>[14:32] you know should this you know should<br>[14:34] this should this redirect or like you<br>[14:37] know like uh or it would come up with<br>[14:39] kind of it would kind of come up with<br>[14:40] ideas and you're like you know what that<br>[14:41] might be a interesting feature to add to<br>[14:44] the plugin. So in some sense it's it's<br>[14:47] good for discovery of features when<br>[14:49] you're kind of massaging a plugin like<br>[14:50] archive WP into its final state because<br>[14:54] that was one thing that kind of I found<br>[14:57] interesting about archive WP was the<br>[14:59] initial idea of it and and a little bit<br>[15:01] of background on that is that this was<br>[15:03] actually a a plug-in that we created for<br>[15:06] a customer for one of our remediation<br>[15:08] customers that needed uh something<br>[15:12] similar and and and and we had the idea,<br>[15:16] well, other clients are going to need<br>[15:18] this. We have more clients that need<br>[15:20] this and why don't we make it so that<br>[15:22] it's something that can be utilized<br>[15:24] across um many websites. And as any<br>[15:27] developer knows, making something for<br>[15:29] one website<br>[15:31] and making something for all websites is<br>[15:33] quite the feat.<br>[15:35] >> It's quite a lot of additional work to<br>[15:36] make it work across websites.<br>[15:40] So the the original U version like used<br>[15:43] like short codes to output stuff and was<br>[15:46] very opinionated on its design and<br>[15:50] layout whereas archive WP is very<br>[15:52] nonopinionated on the design and layout.<br>[15:55] Now we've<br>[15:56] >> I will I will step in actually here and<br>[15:58] say that while the original<br>[16:00] implementation of this on the client<br>[16:02] website was based on short codes and we<br>[16:05] have built this plug-in based on blocks,<br>[16:07] short codes are still available and they<br>[16:09] are fully equivalent to the blocks. So<br>[16:11] if you have a website that does not use<br>[16:12] the block editor or a custom postite<br>[16:15] that is not yet block enabled, you are<br>[16:18] still able to use these blocks wherever<br>[16:20] you choose just by implementing the<br>[16:22] short code. Um, secretly you might<br>[16:25] discover there's some additional<br>[16:26] features of those short codes that<br>[16:28] weren't exposed to the blocks. Someone<br>[16:30] wants to do some digging in.<br>[16:32] >> Yeah. Yeah. So the there's a lot of um<br>[16:36] attributes under the hood and that's<br>[16:38] what William's trying to say.<br>[16:40] >> Yeah. And um and we archive WP does have<br>[16:44] a a a onboarding wizard that will<br>[16:47] actually help you build this page. It'll<br>[16:49] create the page if you haven't created<br>[16:50] it or it'll let you choose an existing<br>[16:52] page and it'll actually implement the uh<br>[16:55] the block patterns or the short codes<br>[16:57] with a tiny bit of HTML markup to kind<br>[17:01] of get some layout into a uh classic<br>[17:04] editor page. Um, so what we've tried to<br>[17:08] do with ArchiveWP is we've tried to make<br>[17:11] this process as easy and seamless for<br>[17:14] the enduser to to one get the plug-in<br>[17:17] installed to get a page created and to<br>[17:19] archive their content. Literally within<br>[17:21] a few clicks, you can have all your<br>[17:23] content archived into its own custom<br>[17:26] post type isolated from all the other<br>[17:29] custom post types with disclaimers for<br>[17:31] accessibility compliance.<br>[17:33] And uh it took a lot of work to get uh<br>[17:37] from that initial piece that we made for<br>[17:38] the client to a fully functional uh<br>[17:42] premium plugin.<br>[17:44] So looks like uh we have Daniel on the<br>[17:48] live stream.<br>[17:50] >> Oh, hi Daniel.<br>[17:52] >> And Daniel says, "Thank you for all the<br>[17:54] improvements this year." Well,<br>[17:58] our pleasure, Daniel. Oh,<br>[18:00] >> so so I was on a call with Daniel a<br>[18:02] couple of weeks ago debugging the thing.<br>[18:04] So it's nice to see people<br>[18:06] >> Oh, awesome.<br>[18:06] >> People coming in.<br>[18:07] >> Cool.<br>[18:09] >> Any more problems, just reach out.<br>[18:11] >> Yeah, we're here to help. Daniel, thanks<br>[18:14] for joining us and uh look forward to a<br>[18:17] lot more next year. We are in the<br>[18:19] planning phases of uh features and new<br>[18:22] things for accessibility checker for<br>[18:24] next year.<br>[18:27] Cool. So those are the major releases.<br>[18:30] So two new plugins this year. Um<br>[18:34] but we didn't neglect our existing<br>[18:36] plugins and we have done a lot on that<br>[18:40] side. So this next uh feature I don't<br>[18:44] know if feature is the right word but<br>[18:46] this next uh area that we implemented<br>[18:50] throughout all the plugins it was was<br>[18:53] kind of huge. And if I'm being a little<br>[18:55] honest, uh, William and I were a little<br>[18:58] apprehensive to, uh, undertake this, uh,<br>[19:01] because we knew it was going to be quite<br>[19:04] the undertaking. So,<br>[19:06] >> this was a lot more effort than expected<br>[19:09] and also exposed some<br>[19:12] interesting things for me about the way<br>[19:14] WordPress handles this under the hood.<br>[19:17] >> This is my first deep dive into this in<br>[19:20] a very long time.<br>[19:23] >> Yeah. Yeah. So, do you want to say what<br>[19:25] it is, William?<br>[19:26] >> Yeah. So, we fully we we tackled<br>[19:29] internationalization<br>[19:31] of our plugins this year. So, we have<br>[19:33] made them fully translatable<br>[19:37] as far as we could. If you find anything<br>[19:40] that's missing translation functions,<br>[19:41] let us know. But we're quite confident<br>[19:43] we've caught everything at this point.<br>[19:47] And we translated the plugins, our<br>[19:50] entire suite into<br>[19:53] 30<br>[19:54] plus languages, at least 32, but some<br>[19:57] plugins have a couple more.<br>[20:00] >> Yeah.<br>[20:01] So So what does that mean? Why why why<br>[20:05] would we do this?<br>[20:06] >> Well, accessibility of content is not<br>[20:09] necessarily just about how the content<br>[20:12] behaves in the browser. Sometimes it's<br>[20:15] inaccessible for someone because they<br>[20:17] don't speak English and that you know is<br>[20:20] a problem for well more than half of the<br>[20:22] world does not speak English and now our<br>[20:25] plug-in is available to a lot more<br>[20:27] people who will now be able to take<br>[20:29] advantage of these features and the user<br>[20:32] the users of our plug-in our plug-in<br>[20:35] becomes more accessible due to the<br>[20:36] translations and the users of those<br>[20:38] people's websites become more accessible<br>[20:41] due to the fixes that we provide or help<br>[20:43] these site owners do. So, it it's it's<br>[20:46] partly about reaching more people, but<br>[20:48] it also is just it's just the right<br>[20:51] thing to do<br>[20:52] >> actually.<br>[20:54] >> Yeah. I mean, basically um uh<br>[20:57] translations and internationalization is<br>[20:59] is accessibility like and it's and it<br>[21:03] really is. it it actually is taking the<br>[21:05] accessibility checker and then making it<br>[21:07] available for more more people and and<br>[21:11] in doing so, right? Um and it goes to<br>[21:14] show sometimes your own like uh<br>[21:16] apprehensions or I mean dare I even say<br>[21:19] our own biases when when you kind of say<br>[21:23] well we don't need to do that right or<br>[21:24] like that'll take so much time it's not<br>[21:26] worth the time or something and you<br>[21:28] don't think it's really going to have a<br>[21:30] benefit. Um to our surprise, we think it<br>[21:33] has had quite the benefit in our install<br>[21:36] counts from from different countries. Um<br>[21:40] Germany being probably the the top<br>[21:42] country that we've seen uh the most<br>[21:46] adoption from after implementing this<br>[21:49] internationalization. Now, there's some,<br>[21:52] you know, that coincides with a lot of<br>[21:54] uh, you know, the European Accessibility<br>[21:56] Act coming into place and and Europe<br>[21:58] having pro or not Europe, uh, Germany<br>[22:01] having<br>[22:03] probably some of the more stricter uh,<br>[22:05] requirements. I<br>[22:06] >> I think they're definitely a first to<br>[22:08] implement type country where they lead<br>[22:10] the way in a lot of these things. Um, in<br>[22:13] addition to Germany though, I have<br>[22:14] noticed an awful lot more Asian users<br>[22:17] coming in and you know identified by the<br>[22:20] fact that I can't read their names<br>[22:23] sometimes.<br>[22:24] >> Yeah.<br>[22:24] >> Um, coming in in Korean, Japanese,<br>[22:28] um, so lot more people in languages that<br>[22:30] I would not have expected. I mean, these<br>[22:33] are countries that might not have the<br>[22:35] same regulations in the way that um,<br>[22:38] Germany does.<br>[22:40] >> Yeah. Yeah, but these these are still<br>[22:41] using our plugin and maybe they would<br>[22:44] have if we hadn't translated it or maybe<br>[22:46] they wouldn't like we we'll never know<br>[22:48] because we now offer these translations.<br>[22:51] >> Yeah. Yeah.<br>[22:53] Yeah. I think it was great. And I think<br>[22:55] it it it's a little bit of a us<br>[22:57] practicing what we preach and um and we<br>[23:01] implemented this just before our team<br>[23:03] went to<br>[23:05] uh work camp Europe and uh so that we<br>[23:07] could have we could take we at us as an<br>[23:10] American company flying over to Europe<br>[23:13] um saying hey you know we're here to<br>[23:15] support you as the accessibility uh the<br>[23:18] European accessibility act comes into<br>[23:20] place. It was it was kind of on us to<br>[23:23] kind of practice what we preach a little<br>[23:24] bit. If we're going to support these<br>[23:26] these European countries and and and<br>[23:29] other countries, Asian countries<br>[23:30] throughout the world, that we should<br>[23:33] make this plug-in readable to everybody.<br>[23:36] And um<br>[23:39] and and I think it was probably one of<br>[23:41] the best things we did this year. And um<br>[23:44] >> it it definitely has it was worth the<br>[23:47] time.<br>[23:48] >> Yeah. Yeah,<br>[23:48] >> can't say that about every feature that<br>[23:50] we try. You know, you hindsight is<br>[23:53] great. In hindsight, we were mistaken to<br>[23:56] put this off for so long.<br>[23:58] >> Yeah, I think so. So, from a technical<br>[24:02] perspective,<br>[24:03] I mean, how do you how do you translate<br>[24:06] a plugin to that many languages? like<br>[24:08] well before we say how we get into<br>[24:11] translating it for so many languages<br>[24:12] let's just maybe talk a bit about how<br>[24:14] translations in WordPress works because<br>[24:16] this is the first time I have undertaken<br>[24:18] a large<br>[24:21] translation project in WordPress since<br>[24:24] the since the more common<br>[24:27] I want to say commonization I don't<br>[24:29] think that's a word but it's the closest<br>[24:31] that I can get to um strings inside<br>[24:35] JavaScript files is<br>[24:39] far more common now than it would have<br>[24:41] been just five or six years ago. And PHP<br>[24:44] we have well understood translation<br>[24:47] functions. You know we use the double<br>[24:49] underscore type functions and you know<br>[24:53] it does static analysis using get text.<br>[24:56] So it finds the translations it converts<br>[24:59] it into a pot file. Translators can take<br>[25:01] the pot file they can generate<br>[25:03] individuals for their each language. So<br>[25:07] it is static analysis. However, when you<br>[25:10] have JavaScript in your plug-in, quite<br>[25:12] often you use minification or<br>[25:15] uglification of the JavaScript code<br>[25:18] because we always want to deliver the<br>[25:20] smallest packages possible to the<br>[25:22] client. And when that code has been<br>[25:24] minified or uglified, it's really quite<br>[25:27] difficult to discover where those<br>[25:28] strings are inside of the content. And<br>[25:31] this was a challenge I didn't foresee<br>[25:33] being a problem, but it ended up<br>[25:35] actually being a huge issue for me is<br>[25:37] how to find these strings inside<br>[25:41] minified JavaScript files because we can<br>[25:43] find them quite easily in our source<br>[25:45] code because it's nice broken into<br>[25:48] lines. All of the all of the tokens<br>[25:50] still exist there, but in the minified<br>[25:53] files, we had to do some configuration<br>[25:55] hurdles to get it to keep those<br>[25:58] translation files there. And once you<br>[26:00] have those translation files, they<br>[26:02] actually don't get built in the same way<br>[26:03] and delivered as PHP translations do.<br>[26:07] There's actually JSON files that you<br>[26:09] also need to deliver to the client side<br>[26:11] whenever there's a translation<br>[26:12] available. So yeah, translations are a<br>[26:15] lot more complicated than they used to<br>[26:18] be if you have to support JavaScript,<br>[26:20] which in this day most of us have to<br>[26:23] support JavaScript translations.<br>[26:25] >> Yeah. Yeah. Yeah.<br>[26:27] So uh yeah. So we had some technical<br>[26:29] hurdles to get over. We actually had to<br>[26:33] kind of set our mindset a little bit<br>[26:35] around it too where it was like our<br>[26:38] plugins are are our strings are mostly<br>[26:40] all translated. there might be some like<br>[26:43] low lowhanging strings that were kind of<br>[26:46] missed over the years and it was kind of<br>[26:49] like in our heads we're like well we<br>[26:50] just need to we need to get the<br>[26:53] mechanism in there to translate these<br>[26:56] and and these translations are a little<br>[26:59] bit AI assisted and um we need to have<br>[27:03] the workflows built into our pipeline so<br>[27:06] that these translations happen with<br>[27:08] every release and then once we have that<br>[27:12] then we can kind of go back and and<br>[27:14] clean up code where there are some<br>[27:16] strings that may not be translated uh<br>[27:19] correctly. Uh so in our heads it wasn't<br>[27:21] like oh we've got to go through five<br>[27:23] plugins fix all the strings and no it<br>[27:26] was like let's put the mechanism in<br>[27:28] place things are translated all the<br>[27:30] strings like 90% of the strings are<br>[27:33] ready to go let's just put the mechanism<br>[27:35] in place and get the the translation<br>[27:38] files for those and then we'll go<br>[27:40] through Turns out that once we had put<br>[27:42] the mechanisms in place, it became much<br>[27:44] easier to discover where we had missed<br>[27:46] the string somewhere because we could,<br>[27:48] you know, I'm pretty sure I could<br>[27:50] confidently navigate and read our<br>[27:53] plug-in in French at this point because<br>[27:55] French was the language that I chose<br>[27:56] when I was debugging things. But if<br>[27:59] you're reading, you know, the settings<br>[28:01] in French and suddenly you see an<br>[28:02] English word,<br>[28:04] >> you know, that's missing a translation<br>[28:05] function. And that really did help us to<br>[28:07] get I I want to say almost all of them<br>[28:10] but at very least we have covered 98% of<br>[28:13] all of the strings in our plugin.<br>[28:16] >> Yeah. Yeah. Totally<br>[28:19] cool. So let's move on to um<br>[28:23] accessibility checker pro. So what did<br>[28:26] we do this year in accessibility check<br>[28:27] checker pro? So we we expanded the<br>[28:31] scanning capabilities. Uh we added the<br>[28:34] ability to scan post type archives and<br>[28:36] taxonomy terms which we've spoken about<br>[28:38] on a previous change log liveream. Uh do<br>[28:42] you want to speak to that at all<br>[28:44] William?<br>[28:45] >> Yeah so that was a a fiveyear desirable<br>[28:49] feature that took a very long time to<br>[28:52] implement. That feature predated me even<br>[28:54] working on any of this code. I didn't<br>[28:56] know that was a feature that was<br>[28:57] desirable.<br>[28:58] >> Mhm.<br>[28:59] >> Um at first, but it turns out quite<br>[29:01] desirable. Um Steve actually came up<br>[29:04] with the the way we could solve this<br>[29:06] under the hood is effectively building<br>[29:09] our entire plugin is set up around the<br>[29:11] the ethos of post IDs and archive pages<br>[29:15] do not have post IDs which was the real<br>[29:17] complication here and Steve had the idea<br>[29:20] of why can't we just virtually create<br>[29:22] these IDs and as such we do we just<br>[29:26] virtually create a post for every single<br>[29:29] one of the archive terms that want to be<br>[29:30] scanned and we and store our data on the<br>[29:34] virtual post, allowing us to scan every<br>[29:37] single archive page you have on your<br>[29:39] site, which includes custom post type<br>[29:42] archives, as well as all your taxonomy<br>[29:44] archives like categories, tags, or any<br>[29:48] custom taxonomies that you create that<br>[29:50] have archives visible. So yeah, all of<br>[29:54] those pages are now scannable and you<br>[29:56] can get results in exactly the same way<br>[29:58] that you would get results for typical<br>[30:00] posts. They're reflected in your overall<br>[30:03] site report. And if you know if you have<br>[30:06] the exporter plugin, you can export all<br>[30:09] those results as well and filter them to<br>[30:11] the individual archive that needs fixed.<br>[30:15] Um I will say that I discovered that you<br>[30:17] usually don't need to scan every single<br>[30:19] archive. So, we do have some form of<br>[30:22] like smart sampling built in because if<br>[30:25] you have one category archive, it's<br>[30:28] probably the same as all the other<br>[30:29] category archives in terms of its<br>[30:31] construction. So, you theoretically only<br>[30:33] need to scan one. Um, but what we do<br>[30:37] have is we scan one that is<br>[30:41] representative of a maximum number of<br>[30:43] posts. So, it will show pageionation and<br>[30:45] the minimum number of posts. So ideally<br>[30:46] it won't have pageionation and you know<br>[30:49] so we cover at least two at least three<br>[30:53] taxonomies<br>[30:54] >> or each three pages per taxonomy type.<br>[30:58] >> Yeah.<br>[30:58] >> In in the smart sampling mode. You can<br>[31:00] of course turn on full sample and you<br>[31:03] can just scan every single page which is<br>[31:06] probably what a lot of customers might<br>[31:08] end up doing but<br>[31:10] >> right<br>[31:10] >> that can take a very long time if you<br>[31:13] have thousands of terms<br>[31:15] >> and and and lots of custom post types.<br>[31:19] >> Yeah. Yeah. So this was just this like<br>[31:22] William said five years ago this was<br>[31:24] probably like this is probably feature<br>[31:26] number one that was on our list and uh<br>[31:29] and it just got kept getting pushed<br>[31:31] because of the complications around it<br>[31:33] like William said about you know archive<br>[31:35] pages are dynam dynamically generated<br>[31:39] pages you know on they're generated on<br>[31:41] the fly basically and and there's no<br>[31:44] there's no post ID there if there's no<br>[31:47] post ID there's no post meta<br>[31:50] And the accessibility checker requires<br>[31:52] post meta quite a bit. And so us coming<br>[31:56] up with a u us putting our engineering<br>[31:59] heads together and coming up with a a<br>[32:01] unique way to slot that into the plugin<br>[32:03] without a complete refactor of the whole<br>[32:05] plugin was a huge win for us and a huge<br>[32:08] win for uh our users. uh so now that<br>[32:12] they can they can get more coverage in<br>[32:14] their scans and have uh more assurance<br>[32:17] that uh their website is uh being<br>[32:20] scanned for accessibility compliance. So<br>[32:22] along with with that William you want to<br>[32:24] talk about the next one<br>[32:26] >> performance wins.<br>[32:28] >> Well before that there's there's a<br>[32:30] bullet point<br>[32:31] >> oh<br>[32:31] >> above that.<br>[32:33] >> Yeah. Yeah. So you you have a post page<br>[32:36] and a front page on in most WordPress<br>[32:39] websites and<br>[32:41] previously we weren't always scanning<br>[32:43] them depending on what the configuration<br>[32:45] is. So now we actually go out our way to<br>[32:48] make sure that we do scan your blog<br>[32:49] page. Um and also your you know front<br>[32:53] page if you know your front page is<br>[32:55] almost always going to have an ID<br>[32:57] >> but your blog post<br>[32:59] may not if you have not assigned a<br>[33:01] static page to it and if you had not<br>[33:03] assigned a static page to it we<br>[33:05] previously might have missed it but now<br>[33:07] that isn't the case. We will actually<br>[33:08] try and scan that page all the time now.<br>[33:12] >> Yeah. due to the fact that we could it's<br>[33:14] technically an archive for the posts and<br>[33:16] is now discoverable and virtually<br>[33:19] exists.<br>[33:21] >> Yeah. So um just like another it's not<br>[33:23] an archive page but kind you know but it<br>[33:26] is kind of a<br>[33:27] >> an archive page internally.<br>[33:28] >> Yeah. But we can't capture it as an<br>[33:30] archive page the same way. So we've gone<br>[33:34] the extra step to kind of consider that<br>[33:36] as well. Now there is some other<br>[33:37] considerations beyond archive pages and<br>[33:40] ma main post and blog post page and<br>[33:45] there are other things that we're<br>[33:46] looking to add in such as uh<br>[33:49] uh author pages and was there anything<br>[33:52] else besides that?<br>[33:53] >> Um so I did previously look into for my<br>[33:56] own use um element templates. M<br>[34:01] >> so you know not only can we scan actual<br>[34:05] things that are considered as pages we<br>[34:07] can probably quite soon start scanning<br>[34:10] things that are considered as partials<br>[34:12] such as element templates page templates<br>[34:15] for Gutenberg<br>[34:17] >> um you know<br>[34:19] any number of individual components that<br>[34:23] page builders implement that are<br>[34:25] available through some form of URL URL<br>[34:28] rewrite fees feasibly we can create a<br>[34:30] virtual post ID for and scan in a live<br>[34:33] page type of way. So no immediate plans<br>[34:37] on what we will scan next but floodgates<br>[34:40] are ready to open on that one. There's<br>[34:43] lots of options of what we could scan.<br>[34:46] >> Yeah, totally cool. So like you said<br>[34:50] performance um so this year we<br>[34:53] >> Amber did actually just comment in FSE<br>[34:55] templates.<br>[34:56] >> Yeah. Yeah. Exactly. Yeah. Yeah. Yeah.<br>[34:58] Totally.<br>[34:59] >> Soon PM.<br>[35:02] >> Yeah. Yeah. So, fullsight editing<br>[35:05] templates. Yeah. Exactly. That's uh um<br>[35:09] those are little pieces that we could<br>[35:11] probably push through the same mechanism<br>[35:13] that we did the uh the archive page. And<br>[35:17] uh now there is a whole there's a bigger<br>[35:20] picture here too, right? like we c we<br>[35:22] can keep kind of chasing the<br>[35:25] the WordPress rewrite template part<br>[35:28] thing or we could switch how<br>[35:31] accessibility checker works and actually<br>[35:33] start pulling from direct URLs based off<br>[35:36] of sitemap or some kind of scraping of<br>[35:39] the website. So<br>[35:41] um yeah totally. Um<br>[35:47] so performance um this was kind of a big<br>[35:50] one but I feel like this was kind of a<br>[35:52] feature that was uh implemented kind of<br>[35:54] under the radar. It it was so this was<br>[35:57] actually performance of the full set<br>[35:59] scanner was looked at partly due to<br>[36:04] >> I don't want to say a great many but a<br>[36:05] larger than other issues type of support<br>[36:09] request that comes in is to do with the<br>[36:11] full set scanner particularly how fast<br>[36:13] it is as we all know it isn't actually<br>[36:16] very fast in a lot of cases. Um, so as<br>[36:20] part of some of those complaints from<br>[36:22] users, we re we looked at how the<br>[36:24] queries work, how we gather the posts<br>[36:27] and you know, first off, we actually<br>[36:29] made it immediately faster by dropping<br>[36:32] one half of our scanner.<br>[36:34] I mean, we dropped the faster half. We<br>[36:37] had the two-part scanner, we dropped the<br>[36:38] faster half, so we're only left with the<br>[36:40] slower part, but that does speed up the<br>[36:43] scanner generally. But in addition to<br>[36:46] that, there was query optimizations and<br>[36:48] some caching added that actually does<br>[36:50] for it won't benefit the majority of<br>[36:52] sites, but for large sites, you you're<br>[36:55] looking at five, six, 7, 10, 20 times<br>[36:59] faster sites for very very large sites.<br>[37:02] Like if you have a site that has 100,000<br>[37:05] posts on it, the full site scanner will<br>[37:09] be dramatically faster for you after we<br>[37:12] made those query optimizations. And<br>[37:13] there are definitely more of them to<br>[37:16] come.<br>[37:16] >> Yeah. Yeah. Um we'll talk about this<br>[37:19] here in a little bit too on why we<br>[37:21] dropped that first half of the scanner.<br>[37:23] When Williams says we dropped the first<br>[37:24] half of the scanner, what we're talking<br>[37:26] about is there it used to have two<br>[37:28] passes. There was a<br>[37:30] >> a a you know it was behind the hood<br>[37:33] under the hood. It was a PHP scan and<br>[37:35] then it was a JavaScript scan because we<br>[37:37] had some rules that were written in PHP<br>[37:41] and all we had to do was parse HTML for<br>[37:44] that and then we had some rules that<br>[37:45] were written in JavaScript which<br>[37:47] actually would pull up the actual<br>[37:50] website page and scan it from the front<br>[37:52] end with the full render.<br>[37:53] >> Well, actually at first all of the roles<br>[37:56] were in PHP aside from color contrast.<br>[38:00] So<br>[38:00] >> we would run the JavaScript scan only<br>[38:02] for color contrast at first, which<br>[38:04] unfortunately is the slower half of the<br>[38:07] scan.<br>[38:08] >> Yeah. Yeah.<br>[38:10] >> But more accurate half.<br>[38:11] >> Yes. Dramatically more accurate.<br>[38:14] >> So<br>[38:15] >> I mean that's why we we could not do<br>[38:17] color contrast in the PHP scan the first<br>[38:20] half.<br>[38:22] >> Right. Right. And and actually even<br>[38:24] going further back when you know we<br>[38:26] talked about accessibility checker. It's<br>[38:27] getting ready to turn 5 years old.<br>[38:30] um that the scan was all initially PHP<br>[38:34] and even our color contrast was PHP but<br>[38:36] out of the necessity to make it more<br>[38:38] accurate we started switching that to<br>[38:41] JavaScript over time and like I said<br>[38:43] here in a little bit we'll talk a little<br>[38:44] bit more about that switch to JavaScript<br>[38:47] but uh aside from that um William has<br>[38:52] done a lot to implement uh to make the<br>[38:55] plug-in much more WP CLI compliant and<br>[38:59] or I don't know if compliance is the<br>[39:01] right word but uh ready we've been<br>[39:03] working on a lot of our own commands and<br>[39:05] >> yeah so selfishly because I had actually<br>[39:08] created some commands for my own<br>[39:11] development purposes that later on was<br>[39:14] answered or mentioned by<br>[39:18] um Chris had mentioned that a client had<br>[39:20] asked for some of these WPCLA commands<br>[39:22] and I was able to say like oh yeah I've<br>[39:25] been using that already That's<br>[39:28] >> that's mines. I had to do a bit of clean<br>[39:29] up to make it production ready, but now<br>[39:32] we have shipped a handful of WP CLA<br>[39:35] commands and we have added a couple more<br>[39:38] over time. Um, primarily<br>[39:41] maybe the most useful one for an average<br>[39:43] user would be a programmatic way of<br>[39:46] getting the individual<br>[39:48] scan stats for a single page if you had<br>[39:51] such a need or you know the full site of<br>[39:55] scan stats as also if you had such a<br>[39:57] need. And I can imagine a a few people<br>[40:00] might programmatically want to grab them<br>[40:02] rather than having to log into a whole<br>[40:04] bunch of individual sites and check<br>[40:06] their numbers, right?<br>[40:08] Yeah. And things like uh license key<br>[40:10] activation, deactivation,<br>[40:12] um adding the license key, things like<br>[40:15] that. Um and a lot of that was done in<br>[40:17] prep with some uh some of the<br>[40:18] partnerships that we've uh uh put<br>[40:23] together this year with some of our<br>[40:24] hosting partners. Um so that they can be<br>[40:27] able to run CLI commands in their<br>[40:29] pipelines to be able to uh activate and<br>[40:32] deactivate and add license keys to the<br>[40:34] to the plugin. Uh, one of our more<br>[40:37] recent uh, partnerships is with<br>[40:39] Cloudways and uh, some of these uh,<br>[40:41] requests came from them as well to be<br>[40:43] able to do these things. Yeah. Well,<br>[40:46] technically a hosted partnership now can<br>[40:49] retrieve a key from a customer and then<br>[40:52] make everything from that point onwards<br>[40:54] entirely seamless in their platform.<br>[40:56] They could, you know, activate the<br>[40:59] plugin, install, activate, and trigger<br>[41:02] scans across some of the pages<br>[41:04] >> like all entirely programmatically<br>[41:07] before a user even has to make it<br>[41:10] anything other than the purchase to get<br>[41:13] their key,<br>[41:14] >> right?<br>[41:14] >> And and actually they could just install<br>[41:16] free as well. So some of these platforms<br>[41:19] can now seamlessly get that up and<br>[41:21] running,<br>[41:22] >> right? So we're doing more to expand<br>[41:25] accessibility checker uh for hosting<br>[41:27] companies as well so that we can make it<br>[41:29] available to their client base and make<br>[41:32] uh integrating uh it into uh those<br>[41:36] hosting plans uh more seamlessly. So<br>[41:39] hosting companies reach out to us. We'll<br>[41:41] get you an integration and we're we'll<br>[41:44] get up and working. So uh man, we're<br>[41:47] running long on time and we got a lot to<br>[41:48] get through. So, we're going to we're<br>[41:50] going to I'm going to rapid fire some<br>[41:51] more things here. So, on accessibility<br>[41:54] checker pro workflow. So, uh we I'm<br>[41:57] going to run through some of these real<br>[41:58] quick. We added filtering by uh post<br>[42:01] status. So, whether it's a draft or<br>[42:03] published, etc.<br>[42:04] >> And this was a highly requested feature.<br>[42:06] People don't want to scan their drafts<br>[42:08] because they don't see any. They might<br>[42:10] have 10,000 drafts.<br>[42:12] >> Yeah.<br>[42:12] >> They're never going to be published.<br>[42:14] >> Yep. Totally. Uh so, you can filter<br>[42:17] those out. You can actually see the post<br>[42:19] status inside the uh open issues uh<br>[42:22] table in accessibility checker pro. Now<br>[42:26] um we added landmark uh selectors to the<br>[42:30] issues table as well. We're talking<br>[42:31] about this. We added landmarks and free<br>[42:34] as well. We'll talk about that allowing<br>[42:36] users to pinpoint the specific location<br>[42:38] of landmarks. Um so we've just surfaced<br>[42:41] that inside of the open issues in the<br>[42:43] pro plugin. We improved rule<br>[42:46] descriptions and metadata to uh provide<br>[42:49] better context on accessibility issues.<br>[42:51] This was a huge undertaking that uh<br>[42:54] Amber took to rewrite some of these<br>[42:57] descriptions and how to how to fix it.<br>[43:00] Um, we've added uh severity uh to issues<br>[43:04] and we've added some kind of intelligent<br>[43:07] severity sorting to our issues in the UI<br>[43:11] to help you surface not only the is not<br>[43:14] only the issues with the because it used<br>[43:16] to sort by<br>[43:18] errors and warnings and then a secondary<br>[43:20] search on the the issue count. So now it<br>[43:24] it it is extended to sort by um severity<br>[43:29] and then issue count. So what we're<br>[43:31] trying to do inside the plugin is always<br>[43:33] expose to you what you can action on and<br>[43:36] get the the most results from.<br>[43:44] So um<br>[43:47] what else? Let's see.<br>[43:50] And then like I said the severity. So<br>[43:51] that's a lot of the the kind of a lot of<br>[43:54] the big features that we've added to<br>[43:55] Pro. Of course, we are always squashing<br>[43:57] bugs and fixing other things in that<br>[44:00] regard. But let's move on to<br>[44:02] accessibility checker free. We call it<br>[44:05] core sometimes, but the the plugin that<br>[44:08] you can get from wordpress.org.<br>[44:12] And uh<br>[44:14] you want to run through this first one,<br>[44:16] will you?<br>[44:16] >> Yeah. So we added um rescan and clean<br>[44:20] issues buttons and these are just nice<br>[44:23] to have userf facing features. These are<br>[44:25] things that we do programmatically quite<br>[44:27] often by going into the database<br>[44:29] cleaning issues. You know no longer do<br>[44:32] we have to do that as developers but<br>[44:34] being able to clear issues sometimes<br>[44:36] fixes edge case bugs if someone changes<br>[44:39] post types or does unusual things.<br>[44:42] Disable the plugin for a while turn it<br>[44:45] back on. So clean issues just resets the<br>[44:48] post and then you can just click to<br>[44:49] rescan and you can immediately get fresh<br>[44:52] results.<br>[44:53] >> Yeah.<br>[44:53] >> And you can also use that like if you<br>[44:55] have you know don't haven't thoroughly<br>[44:58] tested this with a lot of different<br>[45:00] builders but if you use a front-end page<br>[45:02] builder you now have a rescan button on<br>[45:05] the front end that you can then scan as<br>[45:07] you change your content. It works with<br>[45:08] some builders. I haven't tested all of<br>[45:10] them.<br>[45:11] >> Yeah.<br>[45:11] >> If you have a builder that it doesn't<br>[45:12] work on, let us know. Yep. Yeah. Um we<br>[45:17] know that it works really well with<br>[45:19] Elementor. Um we are<br>[45:22] >> Beaver Builder works with most for the<br>[45:25] most part,<br>[45:25] >> right? And we we currently are uh<br>[45:28] working with Etch to get accessibility<br>[45:30] checker working fully with the Etch uh<br>[45:33] website builder and uh we're looking<br>[45:37] forward to uh implementing that. And if<br>[45:39] anybody any other builders have<br>[45:41] problems, feel free to reach out to us<br>[45:42] and we're we'll get those fixed.<br>[45:46] Um, and<br>[45:48] >> as another nice UI feature, we no longer<br>[45:50] overlap icons on the front end. So if<br>[45:53] you're using the front end highlighter<br>[45:54] and an issue has two different warnings<br>[45:57] or one warning, one error assigned to<br>[45:59] it. Those icons will no longer overlap<br>[46:01] each other. They will be stacked neatly<br>[46:02] side by side. So you can click on each<br>[46:05] one individually and see the relevant<br>[46:08] information about that specific issue.<br>[46:11] >> Yeah. Where before if you had multiples<br>[46:13] stacked right on top of each other, you<br>[46:14] had to use the arrows, the next and<br>[46:16] previous areas to get to them. So<br>[46:18] >> and sometimes those issues might not be<br>[46:20] next to each other in the order stack.<br>[46:23] So you would jump up and down on the<br>[46:25] page.<br>[46:26] >> No.<br>[46:28] Cool. So uh new smarter rules. We are<br>[46:31] always trying to refine our rules to<br>[46:34] make them better. Uh Amber's always<br>[46:37] opening tickets for us to with new ideas<br>[46:39] on how to make the rules uh smarter and<br>[46:42] more intelligent and help with uh her<br>[46:45] own uh audits of things. Uh this first<br>[46:49] one.<br>[46:50] >> Yeah. So it's a shame that Daniel isn't<br>[46:51] still here. He did say he had to drop<br>[46:53] off, but this was what the call I had<br>[46:54] with Daniel a few weeks ago was about an<br>[46:56] another improvement we made to the video<br>[46:58] transcript detection. So if videos were<br>[47:02] not not or the transcripts were not<br>[47:03] directly adjacent in terms of the markup<br>[47:06] there might have been cases where it was<br>[47:07] missed and that was the case on Daniel's<br>[47:10] website. So that is now fixed and the<br>[47:13] detection of video transcript should be<br>[47:15] far more reliable for everyone based on<br>[47:19] that change and it was already quite<br>[47:21] reliable. There was just some edge cases<br>[47:23] that meant it might not work<br>[47:26] >> right.<br>[47:28] And uh landmarks, we've talked about<br>[47:29] this a little bit in on when we're<br>[47:31] talking about pro, but we have added uh<br>[47:34] landmark uh location feature to show<br>[47:36] exactly where landmarks are in the DOM.<br>[47:39] So that's in the front-end highlighter.<br>[47:41] It actually will list you what the uh<br>[47:43] landmark location is in the uh in in the<br>[47:47] details tab in on a post or in the uh<br>[47:50] open issues from the pro plugin. and you<br>[47:53] can click on that and it'll open it up<br>[47:55] in the front end highlighter and<br>[47:56] highlight that landmark location. So,<br>[47:58] just doing more to try to show you where<br>[48:00] issues are and we actually have plans to<br>[48:03] expand that to be able to start<br>[48:05] segregating out issues based on which uh<br>[48:09] which user role should be seeing which<br>[48:12] which issues. So, basically um an editor<br>[48:16] probably doesn't need to see issues in<br>[48:18] the header and footer. Those are global<br>[48:20] issues. Well, they may want to seen them<br>[48:21] still, but they probably can't fix them<br>[48:23] or not in a position to fix them. So<br>[48:25] maybe you might want to show them only<br>[48:27] actionable issues, in which case an<br>[48:29] editor might only see issues that are<br>[48:31] directly inside the content area or the<br>[48:34] main tag.<br>[48:35] >> Yeah.<br>[48:36] So cool.<br>[48:40] Then uh so links we improved checks for<br>[48:44] anchor exists uh missing title attribute<br>[48:47] and new window warnings.<br>[48:49] Was this one you worked on, William?<br>[48:52] >> So, I think I've touched most of these<br>[48:54] rule tweaks over the year. I cannot<br>[48:57] remember<br>[48:59] which ones exactly. Um, however, a lot<br>[49:02] of these were improved from something<br>[49:04] we're going to talk about in a minute,<br>[49:05] the the JS conversion. So, a lot of<br>[49:07] these rules got dramatic improved<br>[49:10] >> accuracy due to some switchovers,<br>[49:13] including the next one that's in this<br>[49:14] list here, the underlying text as well.<br>[49:16] And I will also put Amber a bit on the<br>[49:19] spot here and call out that there might<br>[49:21] also be a naked links roending<br>[49:25] some documentation work.<br>[49:26] >> Yeah, that's my favorite one. Naked<br>[49:28] links.<br>[49:32] >> That that's actually quite a common<br>[49:33] problem that<br>[49:34] >> right<br>[49:35] >> we should be flagging and detecting.<br>[49:37] >> What what is a what is a naked link?<br>[49:39] It's when you just copy and paste a link<br>[49:41] directly from your address bar and it<br>[49:43] might contain all those letters and<br>[49:45] numbers that they use for tracking or it<br>[49:47] might be nested 16 levels deep. And for<br>[49:49] a screen reader, every one of those<br>[49:51] characters is going to be read out and<br>[49:53] that just is a horrible experience for<br>[49:56] someone who might not be visually<br>[49:58] impaired.<br>[50:00] >> Yeah. Yeah, we are. So, we have<br>[50:02] implemented the naked links rule and and<br>[50:05] this is a little bit how the the<br>[50:07] workflow works, right? So, uh, you know,<br>[50:11] a recommendation for a a rule gets added<br>[50:14] to either, you know, our ideas board or<br>[50:18] as an issue in GitHub and and then<br>[50:22] sometimes William or I are have a minute<br>[50:24] and we're we're like, ah, we'll pick<br>[50:26] this one up and then we, oh, that was<br>[50:28] easier.<br>[50:28] >> It never takes just a minute, but there<br>[50:30] >> Well, this one was more complex than<br>[50:32] that, right? But um and then we get it<br>[50:34] and then you know we assign it to Amber<br>[50:36] and we wait for documentation and once<br>[50:38] we get documentation then it we release<br>[50:40] it out to the world for you guys because<br>[50:42] releasing a rule without documentation<br>[50:45] on what does this mean and how do I fix<br>[50:48] it and what are the implications of this<br>[50:50] um is is not a a great uh user<br>[50:54] experience. So, um, but not only that, I<br>[50:58] mean, like when you get the idea for<br>[51:00] like we try to compare like we we use<br>[51:03] Axe core in our plug-in, but an<br>[51:05] extremely<br>[51:07] um extended version of it. We hook into<br>[51:10] it. We change it. We group rules<br>[51:11] together. We we don't use some of their<br>[51:13] rules. We use some of our completely own<br>[51:16] custom rules. And in this case, uh,<br>[51:19] William, the the recommendations that<br>[51:22] came from Amber about what is a naked<br>[51:24] link, um, was was was far more, uh,<br>[51:28] verbose than like what say axe core does<br>[51:31] to detect those, right?<br>[51:34] And, uh,<br>[51:39] >> you good?<br>[51:40] >> I think my internet is being a bit off.<br>[51:42] >> Oh, okay. Okay.<br>[51:44] >> Oh, it is a bit off. Okay. So, William<br>[51:47] is now frozen. So, I will talk.<br>[51:50] >> There's something.<br>[51:51] >> Yeah.<br>[51:52] >> Yeah.<br>[51:53] >> You You talk. Give me one second.<br>[51:55] >> All right. Um, so while William goes and<br>[51:57] kicks his kids off of the internet, um,<br>[52:01] I'll talk about naked links. That's what<br>[52:03] he's doing. The uh Yeah. So anyway, uh<br>[52:08] you know, whether it has a protocol on<br>[52:09] it or doesn't have a protocol on it,<br>[52:12] making those decisions on what actually<br>[52:14] constitutes a naked link, I think what<br>[52:16] we've come up with goes pretty far um to<br>[52:20] making it a very usable rule that<br>[52:23] doesn't create a ton of noise uh for the<br>[52:26] for the end user. So that's a little bit<br>[52:29] of a sneak peek on a rule to come. But<br>[52:33] to that, William, since we're kind of<br>[52:35] talking about rules and JavaScript and<br>[52:38] axe, can you talk a little bit about why<br>[52:40] we decided to<br>[52:42] finally jump and just migrate everything<br>[52:45] over to JavaScript scanning?<br>[52:48] Oh, I can't hear you.<br>[52:50] >> Let me know if you can hear me.<br>[52:53] >> Oh, maybe. Is that<br>[52:56] >> you're<br>[52:56] >> No.<br>[52:57] >> Yeah, there you go. Uh, I think you're<br>[52:59] good. Try to talk.<br>[53:02] Yeah, I think I'm back. I just disabled<br>[53:04] Netflix.<br>[53:08] Oh no,<br>[53:10] he's frozen again. So<br>[53:15] >> yeah, you're still cutting out a little<br>[53:16] bit there, bud.<br>[53:27] >> There we go. You're back.<br>[53:29] I'm back for one second, but I'm<br>[53:32] probably going to disconnect again in a<br>[53:33] second. I'm going to<br>[53:35] >> Yeah. Yeah.<br>[53:35] >> Going to have to shut down some stuff on<br>[53:37] their end.<br>[53:40] >> You on the router cutting them out?<br>[53:43] >> Yeah. And I'm not cutting out the right<br>[53:44] things apparently.<br>[53:46] >> That's right.<br>[53:48] So, I mean, we we used to scan in PHP.<br>[53:52] We kind of migrated to a hybrid approach<br>[53:55] and then this year we went full in. We<br>[53:58] did a major sprint to get these all<br>[54:00] converted over to what we call<br>[54:01] JavaScript rules. And what we mean by<br>[54:04] that is these are this is uh scanning<br>[54:07] code and logic that can be run on the<br>[54:10] actual rendered page. So we can pull up<br>[54:14] a page, we can insert our scanner into<br>[54:16] it, we can scan the page and get uh<br>[54:19] vastly more accurate results than we<br>[54:22] ever could with just straight up PHP<br>[54:24] parsing.<br>[54:26] And uh<br>[54:27] >> yeah, well the the perfect example<br>[54:28] probably is the the color contrast.<br>[54:31] >> Yeah,<br>[54:32] >> is the the first one that was<br>[54:33] transitioned because there's you have to<br>[54:37] read all of the JavaScript, all of the<br>[54:39] CSS, and all of the HTML to try and<br>[54:42] determine what color an object might be<br>[54:45] inside the DOM. And that might actually<br>[54:47] be influenced by external JavaScript<br>[54:49] that runs that you'll never really be<br>[54:51] able to know in a PHP scan. So unless<br>[54:55] you render the page, you won't know the<br>[54:57] actual color and you may also not<br>[55:00] understand what the background color<br>[55:01] would be to do an actual comparison. So<br>[55:04] once you render the page, you know all<br>[55:06] of those things with, you know, a<br>[55:08] guaranteed<br>[55:10] like for certain that there's no<br>[55:13] question in what color is on top of what<br>[55:16] color if you actually render the page.<br>[55:18] And there's a lot of other rules like<br>[55:20] the underlying text row we briefly<br>[55:23] mentioned earlier on. So there's a bunch<br>[55:25] of different ways you can underline your<br>[55:27] text. You can literally just use text<br>[55:29] decoration, a style row, but you can<br>[55:32] also use um border bottom on a row and<br>[55:37] we cannot detect that in PHP with static<br>[55:40] analysis. We cannot determine what a<br>[55:41] thing looks like. However, with<br>[55:43] JavaScript, we can see that and it is<br>[55:45] literally the difference between making<br>[55:48] an educated guess and actually being<br>[55:50] able to see what the thing is going to<br>[55:51] look like to a user in the browser.<br>[55:56] >> There's a huge difference between static<br>[55:59] scan and a live page scan. The the<br>[56:02] downside of the live page scan is that<br>[56:04] it takes up more resources and it's a<br>[56:06] bit slower because of the nature of how<br>[56:09] you have to render the page, but it is<br>[56:12] millions of times more accurate.<br>[56:14] >> Yeah. And you need to you need to leave<br>[56:16] the page open and let it run because we<br>[56:19] need to use your browser to determine<br>[56:21] these things. Whereas when we were doing<br>[56:24] uh the PHP the static analysis we didn't<br>[56:27] need that um u because we actually were<br>[56:30] not rendering the page and and so it<br>[56:33] does require a little bit more resources<br>[56:37] and a little bit more complexity to do<br>[56:40] what it does. But this is actually the<br>[56:44] the def you know what makes<br>[56:46] accessibility checker different than<br>[56:48] almost any other scanner. And um and<br>[56:52] this is what actually brings like<br>[56:54] enterprise SAS<br>[56:56] accessibility scanning that cost a<br>[56:58] fortune. This is what actually we're<br>[57:01] doing to take that and bottle it into a<br>[57:04] WordPress plugin and bring it to<br>[57:07] uh the vast a vast majority of users<br>[57:09] that don't have the resources or don't<br>[57:12] want to pay for those super expensive<br>[57:15] accessibility enterprise accessibility<br>[57:17] tools. Well, a lot of those super<br>[57:18] expensive tools are just running X core<br>[57:21] right out of the box. They're not doing<br>[57:23] any customization or any tweaking. And<br>[57:26] you know, I was quite surprised that<br>[57:28] with our bucket of, you know, however<br>[57:31] many rules we have, we only actually<br>[57:33] take directly verbatim from Xcore, a<br>[57:37] handful, maybe five or six of those<br>[57:39] rules. And the rest of these custom<br>[57:41] rules are extensions of Xcore rules or<br>[57:44] some of them are very WordPress specific<br>[57:47] rules.<br>[57:48] >> So we're not just going to give you<br>[57:50] generic answers the way some of these<br>[57:52] like online scan tools are going to<br>[57:55] >> going to manage. We're literally going<br>[57:56] to<br>[57:58] interpret the results of the scan and<br>[58:00] provide only the valuable items as as<br>[58:04] far as we deem. You know, we might<br>[58:07] not have be pulling out all of the<br>[58:09] valuable items as of yet from Xcore, but<br>[58:12] over time we will be adding more of more<br>[58:14] rules, more custom rules, and more<br>[58:17] things that can be scanned against those<br>[58:19] rules.<br>[58:21] >> Yeah. Because we're not we're not just<br>[58:22] looking to build like a, you know, a<br>[58:24] base level compliance<br>[58:27] uh scanner. We're actually looking to<br>[58:29] build a<br>[58:31] a fullfeatured auditing tool to help you<br>[58:34] audit a website. And we expose we expose<br>[58:38] what we call warnings, which are<br>[58:40] actually things that we're prompting you<br>[58:41] as an auditor or just a web developer or<br>[58:45] uh or a website creator, a content<br>[58:47] creator. We're actually prompting you to<br>[58:49] say, "Hey, we can't programmatically<br>[58:52] tell you with with certainty that this<br>[58:54] is an issue, but we think it is and we<br>[58:58] want you to look at it." So, we're doing<br>[59:00] a lot to help come alongside you and and<br>[59:03] to assist in that audit of these<br>[59:05] websites to make them as accessible as<br>[59:07] possible. So along with that conversion<br>[59:10] William um we we we found the need to<br>[59:15] really make sure that our if we're<br>[59:17] writing and extending so much of axe<br>[59:19] core we need to ensure that what we're<br>[59:22] doing is right and that we don't have<br>[59:24] any regressions when we change other<br>[59:26] rules.<br>[59:27] >> Yes. So before I say how we did this let<br>[59:30] me tell you how we used to do this. We<br>[59:32] had the WordPress website. It had the<br>[59:35] bunch of content on that website. And we<br>[59:37] would update the plug-in on that<br>[59:38] website. We would visit the pl the<br>[59:40] website, scan the page, and we would see<br>[59:43] what it finds, what it doesn't, and we<br>[59:44] had lists of things that we expect<br>[59:46] should pass and things that shouldn't.<br>[59:48] And that was all live content on a live<br>[59:50] website that we had access to. And that<br>[59:53] was how we previously were testing this.<br>[59:56] Um, now we have almost every single row<br>[59:59] or every role that we transitioned in<br>[60:01] the most recent batch. I think it's<br>[60:03] probably 90 95% of all the rules that we<br>[60:06] run in our scanner now have fully<br>[60:08] automated JS tests. And this was an<br>[60:11] excellent use of AI we discovered<br>[60:13] because we had the content for most of<br>[60:16] these roles elsewhere. And we were able<br>[60:18] to tell the AI here's the content we<br>[60:20] have generate these tests that automate<br>[60:24] verification that these things pass or<br>[60:26] these things fail. And every time we<br>[60:29] make a change to a rule, these tests get<br>[60:31] run and it tells us whether we have<br>[60:32] broken a rule or improved the rule. And<br>[60:35] if someone comes to us with an issue<br>[60:37] that these rules do not detect, we just<br>[60:39] add it to these unit tests and we can<br>[60:43] change our role or change our tests till<br>[60:46] we get it to pass or fail. And not like<br>[60:50] like we legitimately want to fix exactly<br>[60:52] what's reported. So we take the markup<br>[60:54] snippet directly from these problematic<br>[60:56] websites and verify them against our<br>[60:59] actual row. And the way Jest works is it<br>[61:01] literally spins up and tests against<br>[61:03] this exact markup. So we have a pretty<br>[61:07] high degree of certainty that if we fix<br>[61:09] it in our tests is fixed on someone's<br>[61:11] website.<br>[61:13] >> Yeah. And this is you know this is a<br>[61:15] living and growing test suite like<br>[61:18] William said and we're continually<br>[61:20] adding to it and we don't remove these.<br>[61:22] It just builds up. I mean, we've got<br>[61:23] thousands of code snippets that get<br>[61:25] tested when these rules run. And we can<br>[61:29] even we can even do like um uh we even<br>[61:32] do like testdriven development uh in in<br>[61:35] respects to that where if say Amber says<br>[61:38] we should do this rule, right? We should<br>[61:41] do this check. We should check for this<br>[61:43] certain thing and this is what I think<br>[61:45] uh would be a failure or this is what I<br>[61:47] think would be a pass. we can actually<br>[61:49] take those<br>[61:51] put them into the the test first before<br>[61:54] we even write the the check or the the<br>[61:56] rule and um we can actually take that<br>[62:00] and then use AI to prompt it to say hey<br>[62:02] can you try to make a rule and a and a<br>[62:04] check to to go along with this. So it's<br>[62:07] kind of<br>[62:08] >> it's sometimes hit and miss. I actually<br>[62:10] do think the AI works better the other<br>[62:12] direction where we write some of the<br>[62:14] code. We start off with basic unit tests<br>[62:16] and then we ask it to look at the code<br>[62:19] we've written and extend the unit test<br>[62:21] to make sure that things we change don't<br>[62:23] break something or you know to highlight<br>[62:26] things. The the AI has actually been<br>[62:28] surprisingly good at identifying gaps<br>[62:31] >> in the tests that we have. So we might<br>[62:33] have a series of 10 tests and we can<br>[62:36] prompt the AI and the AI might come back<br>[62:38] and say here's 15 edge cases that you<br>[62:40] didn't consider.<br>[62:41] >> Yeah. And then we just instantly put<br>[62:43] them in and we run the tests and sure<br>[62:45] enough some of them might pass, some of<br>[62:47] them might fail. Some of them might be<br>[62:49] incorrect and we need to continue<br>[62:52] tweaking the rule to make sure that the<br>[62:54] answers we get in the end from the tests<br>[62:56] are exactly what we expect.<br>[62:59] >> Yeah. And as far as regressions like we<br>[63:02] have some rules that actually will share<br>[63:05] like uh helper a helper uh code across<br>[63:09] multiple rules and if you modify that or<br>[63:12] you modify a certain rule you can<br>[63:13] actually you have a lot of uh checks and<br>[63:16] balances there to ensure there's no<br>[63:18] regression that<br>[63:18] >> like for example if we modify how we<br>[63:20] handle area hidden<br>[63:22] >> in terms of visible content if we modify<br>[63:25] the helper that we use for that that<br>[63:27] could break a whole bunch of things<br>[63:29] because that is actually a base<br>[63:30] requirement for a lot of<br>[63:33] screen reader backed rules. If if it's<br>[63:35] already hidden, the screen reader won't<br>[63:37] ever see it. And that might be a<br>[63:38] problem. We might actually want to flag<br>[63:40] that it's hidden and tell you you need<br>[63:41] to unhide this. Or if it is hidden and<br>[63:44] it's problematic content, maybe we don't<br>[63:46] need to tell you that that's an issue<br>[63:48] because the screen reader can't see it.<br>[63:51] So, it is important that that works.<br>[63:53] >> Yeah.<br>[63:54] >> We need to make sure that that our<br>[63:56] helper does not get broken. Yep.<br>[64:00] So, I mean that's a rundown on what we<br>[64:03] are doing on our end to ensure accuracy<br>[64:06] to make sure that your your issues are<br>[64:08] actual issues, not false positives and<br>[64:10] that we are continuing to build build a<br>[64:13] huge library of tests to ensure that<br>[64:15] with every update that uh that all of<br>[64:19] our rules continue to work and that we<br>[64:21] don't create any downstream problems.<br>[64:24] So, we are running short of time. I<br>[64:26] think it's time for another lightning<br>[64:27] round to finish up.<br>[64:29] >> Well, you you go lightning around and<br>[64:31] I'll maybe enable I'll turn Netflix back<br>[64:34] on.<br>[64:36] >> Yeah. So, we did some dashboard tools in<br>[64:38] the plugin. We integrated accessibility<br>[64:40] checker into the site health. We're all<br>[64:42] adding some more information in into<br>[64:44] there to not only help you see that<br>[64:48] there. So now in the site health it'll<br>[64:50] actually flag if you have u<br>[64:53] accessibility issues on your website. Um<br>[64:56] and u it flags you know the different<br>[64:59] warnings that come with the site health.<br>[65:01] Um so we're trying to expose<br>[65:03] accessibility checker there. When you<br>[65:04] run site health you can see if there's<br>[65:06] accessibility issues that need to be<br>[65:08] addressed on your website. We added an<br>[65:11] admin toolbar with quick links. Now,<br>[65:13] this is the most easy easy thing, but<br>[65:16] it's one of William and and my favorite<br>[65:20] things is is now having just a toolbar<br>[65:22] with links in it that we can quickly<br>[65:24] jump to our settings page,<br>[65:26] >> go straight to the settings page, no<br>[65:28] longer having to double click<br>[65:30] >> or the fixes page specifically.<br>[65:31] >> Yeah, the fixes page. So, we're just<br>[65:33] trying to make things uh more more<br>[65:35] accessible and uh easier to navigate to.<br>[65:40] So, we have some add-ons. We did some<br>[65:42] work on add-ons as well this year. We<br>[65:44] have our export add-on. Our export<br>[65:47] add-on now includes a wikag levels and<br>[65:50] the severity level in the export. We are<br>[65:54] actually looking at adding some more<br>[65:56] features to the export to be able to<br>[65:58] export uh issues at the post level. Um<br>[66:03] that is an upcoming feature that we're<br>[66:06] looking at uh for the ex exporter<br>[66:09] plugin. And then in our audit history<br>[66:12] plugin, uh, we added a filter to<br>[66:15] customize which user capabilities are<br>[66:17] allowed to view the audit history page.<br>[66:20] So, yep. And this one also came from a<br>[66:23] customer request. So, you know, any<br>[66:26] anyone who has any issues or any<br>[66:29] desirable features they have, send them<br>[66:31] our way because we almost always try to<br>[66:33] implement the things that you request<br>[66:35] because<br>[66:37] we can only come up with so many great<br>[66:38] ideas on our own.<br>[66:40] >> Yeah.<br>[66:40] >> You always come up with some more.<br>[66:43] >> Yeah. So,<br>[66:45] so those are some of the top things and<br>[66:47] like I said, a whole litany of bugs that<br>[66:49] have been squashed throughout the years,<br>[66:51] but we do not have time to go through<br>[66:53] each one of those, but just uh these are<br>[66:55] all the things that we're doing to<br>[66:56] improve the accessibility checker to<br>[66:58] make it easier for you to use and to<br>[67:00] make it more accurate and and to help<br>[67:03] you make your website as accessible as<br>[67:06] possible. So,<br>[67:08] what are we doing next? It's<br>[67:12] >> well next it's Christmas time<br>[67:14] >> so we're we're taking a break<br>[67:16] >> but then yes<br>[67:17] >> but then after the break we are doing<br>[67:20] email reports<br>[67:21] >> right<br>[67:22] >> and not just email reports these reports<br>[67:25] will also provide access to some new<br>[67:28] information that you have to jump<br>[67:30] through some loops to find such as<br>[67:33] identifying the top five pages on your<br>[67:36] your website with issues. So yeah, these<br>[67:39] reports will be available to<br>[67:42] everyone I want to say, not just page<br>[67:45] users.<br>[67:47] >> So yeah, more to come on that.<br>[67:50] >> Yeah. So this is actually a feature<br>[67:52] that's in the works right now. Um it's<br>[67:54] it's not even part of the 2026 roadmap,<br>[67:58] but it's a part of this year's roadmap.<br>[67:59] But as you said, the year is winding<br>[68:01] down and uh equalized digital. We like<br>[68:04] to uh treat ourselves and our team to a<br>[68:07] nice week off at the end of the year<br>[68:09] just as a little thank you for all the<br>[68:11] hard work and to have<br>[68:13] >> forcing me to spend time with my family.<br>[68:15] >> Forcing you to spend time with your your<br>[68:17] family and um<br>[68:21] uh so yeah. So, basically what it is,<br>[68:23] it's going to be the the free plugin.<br>[68:25] You're going to be able to connect it<br>[68:27] with your my dot uh equalize, we call it<br>[68:30] my dot. So, it's your dashboard on<br>[68:32] my.equalized.com.<br>[68:35] Um, you will be able to connect your<br>[68:37] free plugin with the dashboard. If you<br>[68:40] don't have an account, if you got the<br>[68:41] plugin from WordPress.org, you can<br>[68:43] create an account on uh my.equalized.com<br>[68:48] and make that connection. And once<br>[68:50] that's connected, we will get your uh<br>[68:53] your summary report at certain intervals<br>[68:57] and we will send you emails about the<br>[69:00] accessibility uh status of your website.<br>[69:03] A little report on and like William<br>[69:05] said, some new features in that report<br>[69:07] that aren't currently in the plug-in<br>[69:09] where we're identifying the top pages<br>[69:11] that need to be addressed. Uh so that<br>[69:13] you can get that right into your inbox.<br>[69:16] You can see what pages have problems,<br>[69:17] what you know and you can action on<br>[69:19] those right away. And there is uh a lot<br>[69:23] that goes along with that as well. We we<br>[69:26] have thoughts and ideas and these are<br>[69:28] just ideas about um you know we can<br>[69:31] expose that that those reports inside of<br>[69:34] your my.ealizeddigital.com<br>[69:34] vehicledigital.com dashboard and we can<br>[69:38] start to do some a little more<br>[69:40] historical we can expand the the audit<br>[69:43] history plugin that we have we can start<br>[69:46] doing that at at an even bigger level<br>[69:49] and uh exposing some of that<br>[69:51] >> I also want to mention that you know<br>[69:54] audit history is currently only<br>[69:55] available on higher tier licenses and<br>[69:58] with the addition of the email reports<br>[70:00] that is actually going to introduce at<br>[70:02] least a currently versus fast access to<br>[70:07] history of issues for free users as<br>[70:10] well. So this is not just a<br>[70:12] >> all the fanciness is not going to be<br>[70:14] only for paid users. Free users will<br>[70:16] absolutely get a lot of benefit from<br>[70:19] this feature being available as well.<br>[70:21] >> Right. Yep. And what it also does is it<br>[70:24] allows you to collect uh the the<br>[70:27] accessibility status of multiple<br>[70:30] websites into one dashboard on<br>[70:33] y.ealized.com<br>[70:36] >> potentially just one email as well<br>[70:38] monthly.<br>[70:39] >> Yep. So a lot in the works there. We at<br>[70:44] in December uh equalized digital goes<br>[70:46] into kind of planning mode a little bit<br>[70:48] and uh we start to plan out what we're<br>[70:50] going to work on for the next year and<br>[70:53] we are currently in the throws of that<br>[70:55] this week and uh we're doing a lot to<br>[70:58] plan new features for the next year and<br>[71:02] uh I'm super excited to share what those<br>[71:04] are with you all uh late in future live<br>[71:07] streams um once we all get uh a unified<br>[71:11] decision on what those are and uh we<br>[71:14] start<br>[71:14] >> I'll let slip of one that maybe might<br>[71:16] not make the road map but I'm absolutely<br>[71:18] going to do here which is some more<br>[71:20] advanced rules.<br>[71:22] >> You might want to look at whether your<br>[71:24] tabs are correct as opposed to just do<br>[71:27] tabs exist on the page or they<br>[71:29] >> they're correctly<br>[71:31] >> component level accessibility<br>[71:35] >> might be a set of rules in the future or<br>[71:37] there might be some other experimental<br>[71:40] rules. Well, we don't want to give these<br>[71:42] ideas all away. Our competitors are<br>[71:43] watching.<br>[71:46] They're gonna maybe they're going to<br>[71:47] steal all of our ideas. No, no, it's<br>[71:49] it's fine. But no, um, we're always<br>[71:52] thinking about these things. Like<br>[71:53] William said, component level scanning.<br>[71:55] We can identify a component. Why don't<br>[71:57] we just scan the whole component to make<br>[71:58] sure it's complaining? Tabs are hard.<br>[72:01] They're hard to make accessible. So why<br>[72:03] don't<br>[72:03] >> hard to make accessible from a<br>[72:04] development standpoint, but actually<br>[72:06] quite easy to recognize when they're<br>[72:08] wrong from a programmatic standpoint. So<br>[72:12] >> yeah,<br>[72:12] >> let's do that.<br>[72:14] >> Cool.<br>[72:15] Well, do you have any uh closing<br>[72:17] thoughts for 2025, William?<br>[72:20] >> It's been a busy year. Done a lot more<br>[72:23] than we had time to go through here. um<br>[72:26] made a lot of development improvements<br>[72:28] in the plug-in consistently which you<br>[72:30] know is reaping the benefits of how<br>[72:32] quick we can get these features out now<br>[72:34] and you know hopefully next year is a<br>[72:36] year full of features now that we've<br>[72:38] done a lot of that cleanup.<br>[72:40] >> Yeah. Yeah. So my kind of 2025 recap is<br>[72:45] that yes, busy is is is a word I would<br>[72:49] cap the year off with a whirlwind year<br>[72:52] of busyiness and uh but you know that<br>[72:56] just shows what Equalized Digital is<br>[72:57] doing to to and what we're putting into<br>[73:00] this product to make it useful for the<br>[73:02] you for our users and and our commitment<br>[73:05] to pushing accessibility forward uh from<br>[73:08] you know from a technical perspective of<br>[73:11] identifying and fixing issues and and<br>[73:14] continuing on with that and and what<br>[73:16] other areas can we help in this audit<br>[73:19] and reme remediation of accessibility.<br>[73:22] And I just want to end by saying, you<br>[73:25] know, any listeners or or customers of<br>[73:27] or users of accessibility checker, thank<br>[73:29] you. Thank you for trying out the<br>[73:31] plugin. If you haven't used it, please<br>[73:34] grab it. It's free. It's extremely<br>[73:36] fullfeatured free plugin. None of our<br>[73:39] rules are gated behind a payw wall. All<br>[73:42] of our rules,<br>[73:42] >> you get all of the scan capability for<br>[73:44] every post, the same as everyone else.<br>[73:48] >> Um, so I just want to say thank you uh<br>[73:51] anybody that's tried out the plugin and<br>[73:53] all the people that we interact with uh<br>[73:56] uh feel free to reach out to us. We're<br>[73:57] all happy to give advice. We're happy to<br>[74:00] look into bugs. And uh just uh want to<br>[74:03] wish everybody a a happy new year and uh<br>[74:07] we look forward to getting back to it<br>[74:09] next year.<br>[74:10] >> I think we will see you on<br>[74:13] is it the 7th of January?<br>[74:15] >> Yeah.<br>[74:18] >> Um the 8th maybe the week after we're<br>[74:21] back.<br>[74:22] >> Yep. Next live stream will be probably<br>[74:24] around the first week of the year. So<br>[74:26] look for us then. Thanks for joining us<br>[74:28] and <!-- deep-read:sections end -->