# Terminology (plugin, module, project, etc.)

**URL:** <https://community.keyboard.io/t/terminology-plugin-module-project-etc/840>\
**Category:** Programming\
**Created:** [December 8, 2017, 3:13pm UTC](https://community.keyboard.io/t/terminology-plugin-module-project-etc/840 "2017-12-08T15:13:41Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![noseglasses](https://yyz1.discourse-cdn.com/flex031/user_avatar/community.keyboard.io/noseglasses/32/429_2.png) [@noseglasses](https://community.keyboard.io/u/noseglasses)\
**Post date:** [December 8, 2017, 3:13pm UTC](https://community.keyboard.io/t/terminology-plugin-module-project-etc/840/1 "2017-12-08T15:13:41Z")

</div>

@algernon recently wrote about [[Managing core and contributed Kaleidoscope plugins](https://community.keyboard.io/t/managing-core-and-contributed-kaleidoscope-plugins/408/29?u=noseglasses)](his progress) on categorizing parts of the firmware.

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.

What do you think?

---

<div class="post-metadata">

**Author:** ![merlin](https://yyz1.discourse-cdn.com/flex031/user_avatar/community.keyboard.io/merlin/32/3416_2.png) [@merlin](https://community.keyboard.io/u/merlin)\
**Post date:** [December 8, 2017, 5:58pm UTC](https://community.keyboard.io/t/terminology-plugin-module-project-etc/840/2 "2017-12-08T17:58:39Z")

</div>

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…

---

<div class="post-metadata">

**Author:** ![buc](https://yyz1.discourse-cdn.com/flex031/user_avatar/community.keyboard.io/buc/32/523_2.png) [@buc](https://community.keyboard.io/u/buc)\
**Post date:** [December 8, 2017, 7:46pm UTC](https://community.keyboard.io/t/terminology-plugin-module-project-etc/840/3 "2017-12-08T19:46:56Z")

</div>

> [@merlin](#):
>
> 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…

How about **package** as an alternative to **project**?

And **component** for a non-plugin module? Or maybe **component** becomes the general term (also covering plugins) and **module** becomes the specific term for the non-plugin thingy.

OTOH, **wug** sounds cromulent to me.

edited for clarity

---

<div class="post-metadata">

**Author:** ![noseglasses](https://yyz1.discourse-cdn.com/flex031/user_avatar/community.keyboard.io/noseglasses/32/429_2.png) [@noseglasses](https://community.keyboard.io/u/noseglasses)\
**Post date:** [December 8, 2017, 8:01pm UTC](https://community.keyboard.io/t/terminology-plugin-module-project-etc/840/4 "2017-12-08T20:01:28Z")

</div>

> [@merlin](#):
>
> “Kaleidoscope-Foo isn’t a plugin, it’s a wug.”

Fair enough! Let’s call it wug… or … maybe **wugin**?

---

<div class="post-metadata">

**Author:** ![merlin](https://yyz1.discourse-cdn.com/flex031/user_avatar/community.keyboard.io/merlin/32/3416_2.png) [@merlin](https://community.keyboard.io/u/merlin)\
**Post date:** [December 8, 2017, 8:06pm UTC](https://community.keyboard.io/t/terminology-plugin-module-project-etc/840/5 "2017-12-08T20:06:09Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![noseglasses](https://yyz1.discourse-cdn.com/flex031/user_avatar/community.keyboard.io/noseglasses/32/429_2.png) [@noseglasses](https://community.keyboard.io/u/noseglasses)\
**Post date:** [December 8, 2017, 8:18pm UTC](https://community.keyboard.io/t/terminology-plugin-module-project-etc/840/6 "2017-12-08T20:18:03Z")

</div>

That word stole Jean Berko Gleasson from Barry Kripke!

---

<div class="post-metadata">

**Author:** ![jesse](https://yyz1.discourse-cdn.com/flex031/user_avatar/community.keyboard.io/jesse/32/361_2.png) [@jesse](https://community.keyboard.io/u/jesse)\
**Post date:** [December 8, 2017, 8:43pm UTC](https://community.keyboard.io/t/terminology-plugin-module-project-etc/840/7 "2017-12-08T20:43:34Z")

</div>

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.
- Sketch  
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.
- Core  
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 😉

Does that make sense?

---

<div class="post-metadata">

**Author:** ![algernon](https://yyz1.discourse-cdn.com/flex031/user_avatar/community.keyboard.io/algernon/32/4404_2.png) [@algernon](https://community.keyboard.io/u/algernon)\
**Post date:** [December 9, 2017, 11:50am UTC](https://community.keyboard.io/t/terminology-plugin-module-project-etc/840/8 "2017-12-09T11:50:17Z")

</div>

Split this topic on December 9, 2017, 11:50am UTC

8 posts were merged into an existing topic: [Kaleidoscope-CMake](https://community.keyboard.io/t/kaleidoscope-cmake/770)

---

<div class="post-metadata">

**Author:** ![algernon](https://yyz1.discourse-cdn.com/flex031/user_avatar/community.keyboard.io/algernon/32/4404_2.png) [@algernon](https://community.keyboard.io/u/algernon)\
**Post date:** [December 9, 2017, 11:53am UTC](https://community.keyboard.io/t/terminology-plugin-module-project-etc/840/9 "2017-12-09T11:53:14Z")

</div>

(A number of posts that are more related to `Kaleidoscope-CMake` were moved [here](https://community.keyboard.io/t/kaleidoscope-cmake/770/11?u=algernon). There is some overlap with terminology, but the bulk of it is off-topic in this thread.)
