Dark Mode Plugin Repurposed and Renamed to WP Markdown Editor, Change Leaves Users Confused

Last year, I asked Tavern readers if WordPress should notify end-users when a plugin’s owner changes. The post was not entirely based on theory. There have been some cases of real-world confusion. The consensus from the comments on that post seemed to be that, yes, such notifications would be welcome.

When I wrote that post, there was already another plugin changing hands. Dark Mode, which had grown in popularity in its earlier years, had a new owner, WPPool. There were no public notifications of this ownership change. A mere GitHub issue filed, a corner of the web that few users venture.

Fast forward a few months, and Dark Mode had not only changed owners, but it also had a new name and set of features unrelated to the plugin’s original promise. The plugin is now named WP Markdown Editor and bundles at least part of the commercially available Iceberg Editor plugin. It is also a limited version in which users are prompted to upgrade for the complete feature set.

WP Markdown Editor plugin in "Markdown" mode.
WP Markdown Editor (formerly Dark Mode).

Iceberg is licensed under the GPL version 2, so it is legal for anyone to fork it. However, there does not seem to be any mention of the copyright, and only a few references to the original product remain in the source code.

While I did not perform a line-by-line comparison, it is clearly a fork when examining both plugins. However, the company has also built upon it with new features.

Iceberg Editor plugin, showcasing its Markdown editing features.
Iceberg Editor.

“We have recently added productivity sounds, new fonts (more legibility and one for Dyslexic users), which we think definitely adds value to new users,” said the WPPool Team[1].

WPPool announced the WP Markdown Editor plugin in November 2020. However, the post was written as if it was a new product. Technically, it was, but there was no mention of repurposing an existing plugin to launch the features.

The company reached out to the Dark Mode plugin owner in August 2020, which seemed to have changed hands a couple of times, at least. “The plugin was discontinued, lacking security updates, compatibility with latest PHP versions, and the project was abandoned,” said the WP Pool Team.” And, since the last few updates, it was apparent that Classic Editor is not going to stay the same. Gutenberg was the future, and we wanted to give users a Dark Mode for Gutenberg as well.”

WPPool was able to adopt the plugin. The company kept the Dark Mode feature original to the plugin. However, they eventually began tacking on new features.

“Our intention was to add more features on top of it,” said the WPPool Team. “Why not create a new plugin? Because the plugin was already being abandoned, and we thought why not add some more features, keep the old functionality intact as well, and put regular updates?”

The change clearly left some users frustrated and confused about what was happening with the plugin. Many had installed it in hopes of having a simple method of toggling on a dark mode for the WordPress admin interface.

Screenshot of WP Markdown Editor (formerly Dark Mode) after changes went live.  Mostly 1/5 stars.
Reviews after the change.

The plugin now has an “Only Dark Mode” setting, an option that users can enable to remove the additional features. It is disabled by default.

When asked about whether the addition of seemingly unrelated features abused user trust, the WPPool Team replied, “The problem was, since the last few updates of Gutenberg and Classic Editor — Classic Editor uses an iframe to load its content. It’s not possible for the Dark Mode plugin to serve the Dark Mode in Classic Editor anymore. That’s why some users were really frustrated. We really tried hard to restore that functionality to Classic Editor as well, but the way it is, we couldn’t find a way to invoke Dark Mode on Classic Editor.”

While some support questions and reviews indicate the frustration with losing Classic Editor support, many others questioned the addition of features that make little sense as part of a dark-mode plugin.

“This used to be a dark mode feature plugin, but now it’s been turned into a Markdown editor,” wrote Derrick Tennant, an earlier contributor to the plugin. “A complete bait and switch.”

Another user named rehoff had similar concerns, stating, “I still believe that it is not ok to so radically repurpose an otherwise popular plugin. I find it misleading.”

Back to the original question I posed last year, another user summed up the answer with a review titled “This plugin has been sold for sure.”

In private, one person has said that it feels like the team is capitalizing on the plugin’s active install base, which currently sits at 3,000+.

Adding to the potential confusion, the company has a separate and unrelated plugin named WP Dark Mode. A reviewer noted on that plugin:

This same developer had another plugin called Dark Mode. They apparently sold the plugin to someone and now it’s a random Markdown plugin with a terrible UI. All of a sudden, this random Markdown editor that I don’t want or need is on my site.

Who knows what this plugin will become when they get enough users and decide to CA$H IN AGAIN??

If you like having random plugins installed on your site, give it a whirl. Otherwise it may be best to look for a different solution.

This case is unique because the Dark Mode plugin was once a feature proposal for core WordPress. Daniel James, the original creator, started the process to make this a reality in 2018. There was support for the idea, but it never jumped the hurdles needed for inclusion or a more formal proposal.

James put the plugin up for adoption in 2019, stating that he was stepping back from plugin development but hoped that someone would pick it up. David Gwyer picked it up shortly after, eventually making two updates to the plugin. The plugin’s commit history shows that Tennant started contributing several months later before WPPool landed on the scene.

While Dark Mode was never officially endorsed by WordPress or given the green light for merging into the core platform, there was still a level of trust that some might expect from a plugin that was at least proposed as a feature.

Perhaps this is one of those cases where an ownership-change notification would have been warranted, but that notice would not have solved the issues that came months later.

The developers did note the new Markdown editor in the plugin’s change log: “New: Write post/ page with markdown syntax (Markdown Editor).” However, it is doubtful the average user read or understood what that meant. Maybe a more thorough disclosure system is necessary, and would such a system cover cases where plugins are repurposed?


1: I have attributed quotes to the “WPPool Team” throughout this article. I was able to reach the company through their Facebook chat. However, the team did not provide a person’s name and role within the company for attribution. At the moment, I still do not know which employee(s) I spoke with directly.

How to Create a Mosaic Chart Using JavaScript

Data visualization is a valuable tool in today’s scenario, with data everywhere and various opportunities to tap into that data to find insights. Visual charts are imperative to communicate ideas, identify patterns, and make the most of the available data.

So then, would you like to quickly and easily learn how to create a really cool chart that showcases data interestingly?

Apache Kafka and MQTT (Part 4 of 5) – Mobility Services and Transportation

Apache Kafka and MQTT are a perfect combination for many IoT use cases. This blog series covers the pros and cons of both technologies. Various use cases across industries, including connected vehicles, manufacturing, mobility services, and smart city are explored. The examples use different architectures, including lightweight edge scenarios, hybrid integrations, and serverless cloud solutions. This post is part four: Mobility Services and Transportation.

Apache Kafka + MQTT Blog Series

It’s About Location: Developers Draw on Geospatial Tech One Service at a Time

Apps that give users a good reason to keep coming back tend to operate with up-to-the-minute data to do everything from guiding a drone to tracking a global health pandemic’s path. That data is increasingly location-based, be it maps, demographics, routing, or geocoding. A developer might only need one or two of these location services to give users what they want, and that’s where pay-as-you-go location services have entered the market.

As location data is increasingly necessary for in-demand apps, developers at some of the most innovative businesses are already using PaaS to take advantage of location data.

Astro

You can’t even look at code or documentation for Astro (publicly) yet — it’s an in-progress idea — but you can watch a video of Fred showing it off to Feross.

I gotta admit: it looks awesome. I’m bullish on two major parts of this:

  1. Jamstack is a good idea. Producing static, pre-rendered, minimal (or no) JavaScript pages is smart.
  2. Components are a good idea. Crafting interfaces from composable components is the correct abstraction. JavaScript does it best right now because of things like ES Modules, template literals, web components, deeply developed tooling, etc.

I’m a fan of Eleventy also, and this feels like Eleventy in a way, except that I don’t like any of the templating languages as much as I like JavaScript components.

Here’s a list of some interesting aspects:

  • Like Vue has .vue files and Svelte has .svelte files, Astro has .astro files in a unique format. I like how it enforces JavaScript-at-the-top in a Frontmatter-like format.
  • It doesn’t replace other JavaScript libraries. It’s like a site-builder framework on top of them. You can literally use React and JSX components, or Vue files, or Svelte files, including using that library’s state management solutions. You import them in your Astro files.
  • It has the-filesystem-is-the-default-router, like Next.
  • It has scoped-CSS-by-default like Vue’s <style scoped>, meaning it doesn’t even need CSS Modules since you get all the benefit anyway.
  • It ships no JavaScript to the front-end at all, unless you specifically opt-in to it (or use its :visible syntax, which injects just enough JavaScript to lazy load more as needed).
  • It embraces the idea of Islands Architecture — the idea that most sites are composed of static content with only parts of interactive/dynamic content.
  • The idea of only requesting JavaScript for interactive components if they are visible (via IntersectionObserver) is a first-class citizen of the framework — Kinda like loading="lazy" for anything interactive.
  • They credit Marko (the HTML/JavaScript-kind hybrid language) right on the homepage (for “asking the question”). Reminds me of approaches like Alpine or htmx.
  • It sneaks MDX (or the like) in there, meaning you can author content in Markdown (good) but sneak <Components /> in there too (also good).

I quite like that it doesn’t have this whole, This is a new thing! You like it! Old things are bad! New things are good! sort of vibe. Instead, it has a We’re gonna steal every last good idea we can from what came before, and lean on what the native web does best vibe which, in turn, makes me think of Baldur Bjarnason’s “Which type of novelty-seeking web developer are you?” article

Bad:

This is the first kind of novelty-seeking web developer. The type that sees history only as a litany of mistakes and that new things must be good because they are new. Why would anybody make a new thing unless it was an improvement on the status quo? Ergo, it must be an improvement on the status quo.

Good:

This is the other kind of novelty-seeking web developer, one who seeks to build on the history and nature of the web instead of trying to transform it.


The post Astro appeared first on CSS-Tricks.

You can support CSS-Tricks by being an MVP Supporter.

Guide to JWTs for Beginners

JSON Web Tokens, or JWTs, are used almost everywhere — even when they shouldn't be! This tutorial will go over the basics of JWT as well as the specifications in the JOSE, or Javascript Object Signing and Encryption family. 

What Is a JWT?

A JWT is a structured security token format used to encode JSON data. The main reason to use JWT is to exchange JSON data in a way that can be cryptographically verified. There are two types of JWTs:

Moving Lines/Blocks of Code with Option ⬆️ and ⬇️

One of the default keyboard shortcuts I really like from VS Code is the ability to move lines around. I went a long time in my career as a developer never doing this, but once I learned the commands, I use them as naturally as copy and paste. Anytime you’re on a line (or have a selection), you can press Option Up (or Down) and move that line up or down, essentially swapping it with the line above (or below).

It’s very satisfying:

That’s me doing it in CodePen, as we have that feature now with the exact same keyboard command as default VS Code.

From the VS Code docs.

We technically supported this feature before, but it was undocumented (we need to improve the key binding documentation in general). The trick was you needed to have Sublime Text key bindings turned on (you do that in your global Editor Settings), and even then, the keyboard command was different. It turns out that Option Up/Down was already taken, but what it was doing was also undocumented, and could be easily moved. What it was doing was, in the CSS editor only, if your cursor happened to be over a number, Option Up/Down would increment that number by 0.1 in the appropriate direction. Emmet has several of those options, here there are all still working:

Sublime Text still has some additional goodies in it, that I really like, for example Command-Shift-D for duplicating lines. That pairs nicely with these new moving lines commands.

The post Moving Lines/Blocks of Code with Option ⬆️ and ⬇️ appeared first on CodePen Blog.

Automated Pen Testing With ZAP CLI

In the previous post, you learnt how to execute an automated penetration test by means of Zed Attack Proxy (ZAP). This time, you will learn how to execute the test via a Command Line Interface (CLI) which will make it possible to add the test to your CI/CD pipeline.

1. Introduction

In the previous post, the different steps were explained how to execute an automated penetration test. The application under test being used was WebGoat, a vulnerable application developed by OWASP in order to learn security vulnerabilities. This application will be used in this post also. The steps to be executed for a penetration test with ZAP are:

Reentrancy is not allowed: function ‘Lcd_Cmd’ called from two thread

Hi, i wanted to see if someone can help me, im new on this so i dont understand very good, any way, im trying to make a pic that show de characters that recive by bluetooth, to do that im using UART and a LCD, if someone can help with this error or give me a device i would really aprecciate it :)

sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

char recive[20]= " ", delimitadorD = 'D', delimitadorH = 'H', delimitadorV = 'V', delimitador = '#';
char registro;
char ND;

int i=0;

void comparar (){

  if(recive[0]=='d'){

   Lcd_cmd(_Lcd_Clear);
   Uart1_Write_Text("DosCentimetros");
   Lcd_Out(1,1,"Dato recibido");
   Lcd_Out(2,1,"Exitosamente");
   delay_ms(2000);
   Lcd_cmd(_Lcd_Clear);

   }
   if(recive[0]=='c'){

   Lcd_cmd(_Lcd_Clear);
   Uart1_Write_Text("CincoCentimetros");
   Lcd_Out(1,1,"Dato recibido");
   Lcd_Out(2,1,"Exitosamente");
   delay_ms(2000);
   Lcd_cmd(_Lcd_Clear);

   }

   if(recive[0]=='t'){

   Lcd_cmd(_Lcd_Clear);
   Uart1_Write_Text("Trigo");
   Lcd_Out(1,1,"Dato recibido");
   Lcd_Out(2,1,"Exitosamente");
   delay_ms(2000);
   Lcd_cmd(_Lcd_Clear);

   }

   if(recive[0]=='f'){

   Lcd_cmd(_Lcd_Clear);
   Uart1_Write_Text("Frigol");
   Lcd_Out(1,1,"Dato recibido");
   Lcd_Out(2,1,"Exitosamente");
   delay_ms(2000);
   Lcd_cmd(_Lcd_Clear);

   }

}

void interrupt(){

  if(RCIF_bit == 1){
   RCIF_bit = 0;
   recive[i] = Uart1_Read();
   i++;
   if(recive[i-1]==delimitador){
    RCIE_bit = 0;
    i=0;
    comparar();
    RCIE_bit=1;
    Lcd_Out(2,1,i);

   }
   if(recive[i-1]==delimitadorD){
    RCIE_bit = 0;
    i=0;
    RCIE_bit=1;
    Lcd_Out(2,1,i);

   }
   if(recive[i-1]==delimitadorH){
    RCIE_bit = 0;
    i=0;
    RCIE_bit=1;
    Lcd_Out(2,1,d);
   }
   if(recive[i-1]==delimitadorV){
    RCIE_bit = 0;
    i=0;
    RCIE_bit=1;
    Lcd_Out(2,1,s);
   }
  }
}

void main(){

     Lcd_Init();
     Lcd_cmd(_Lcd_Clear);

     Uart1_Init(9600);
     delay_ms(100);

     GIE_bit = 1;
     PEIE_bit = 1;
     RCIE_bit = 1;

}

im using mikro c by the way

RESTful APIs Are Good, But GraphQL APIs Are Usually Better

According to the GraphQL Foundation, GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. Like many influential technologies, GraphQL was developed by Facebook in 2012. In their own words they “needed a data-fetching API powerful enough to describe all of Facebook, yet simple enough to be easy to learn” by their developers.

For a few years, GraphQL was used internally for their mobile applications. The first GraphQL repos were open-sourced in 2015. One of the Github repos contained the GraphQL specification and another contained a GraphQL JavaScript reference implementation.