It seems he is currently working on a grouping/categorization/modularization/git-submodulification of the existing parts of the firmware.
When I read his ideas about categories and the list of projects, it occurred to me that some of these projects, core and third party modules are not plugins in a strict sense.
Up to now everybody uses the term plugin typically when refering to a part of the firmware that is living in its own git repo. Mostly the names of such projects start with Kaleidoscope- .
The term plugin is commonly used for a piece of software that serves as a module for an existing software and inter-operates with it via a well defined API. Mostly this also requires the module to be run-time loadable (plug and unplug). The latter is not the case for the firmware as it is a monolith. So what we commonly call firmware plugins are, in my opinion, not plugins in a strict sense.
There are some projects - I use the term projects here for everything that lives in its own git repo - that do not provide firmware parts, or do not use the plugin-API or only provide headers (Kaleidoscope-Ranges) or do provide code that only interacts with the firmware (e.g. Kaleidoscope-Hardware-Virtual), but are not actually part of the (device-) firmware.
We should consider using more distinctive terms for those different types of projects, e.g.
plugin for everything that is linked into the firmware and uses the plugin-API.
module for everything that is linked into the firmware (including plugins).
project (or maybe a better suited term) for everything that is related to the firmware (including modules), but not necessarily compiled code.
I completely agree that terminology has been fuzzy, and I’d like to see us decide on clearer definitions for terms that we use. I also like the idea of increasing the vocabulary to provide clear distinctions between things. Your definitions of “module” and “plugin” are great, though “project” is not one that I like much (I think “project” is better for a description of the work that is done to make something, rather than the thing that is made). If I think of a better alternative, I’ll let you know.
I also think it would be nice to have a term (or maybe two) for modules that are not plugins, so I can say “Kaleidoscope-Foo isn’t a plugin, it’s a wug.” But I’m also drawing a blank coming up with an idea for that term…
For anyone unfamiliar, “wug” is a famous nonce word from developmental psychology & cognitive science, used in the “wug test” where a novel object is given to a very young test subject, who is told that the object is a “wug”, to see if they use the pluralization rule properly.
I agree that we should have a standard vocabulary. And I’ve let everyone down by not having a written glossary from the get-go. This should include not just the names of chunks of code, but also of objects inside the system. (key, keyswitch, layer, layout, keymap, etc)
In my head:
Library or Arduino Library
Some chunk of code packaged according to the Arduino Library definition. This includes every Kaleidoscope Plugin, as well as Kaleidoscope itself. Not every Library is a Plugin. This is a term already used in the Arduino ecosystem.
Plugin or Kaleidoscope Plugin
An Arduino library that is designed to use the Kaleidoscope Plugin API. Every Plugin is a Library, but not vice-versa. It may be the case that Plugins use or wrap Libraries.
Hardware Definition or Hardware Plugin or…I don’t have a good name for this
An implementation of the Kaleidoscope Hardware API that lets Kaleidoscope talk to a specific keyboard or other device. This is an Arduino Library, but not really a Kaleidoscope Plugin, since it doesn’t use the plugin hooks.
This is the Arduino term for the main program someone runs on their keyboard. It’s not the term I’d pick if I were starting from scratch, but it’s widely used in the ecosystem, so I think we’re stuck with it.
This is the low-level implementation of the Arduino APIs for a given microcontroller implementation. Every Hardware Plugin runs on top of a core, but some may share the same core.
I’m not a fan of ‘module’ or ‘project’ for things that have official definitions. As I understand it, ‘modules’ are a newish c++ core feature. And projects are things that people work on. Kaleidoscope is a project, each plugin is a project. Sometimes a personal firmware sketch is a project.
For naming things people build for Kaleidoscope that don’t use the Plugin API or the Hardware Plugin API…I’m not sure yet. Happy to entertain suggestions. While ‘wug’ is a cromulent word, it’s probably not the right one here