Submission Guidelines

New submissions

If you have not previously submitted a version of your plugin, you can use the "New Plugin" button here to upload a gem. Note that you must be logged in to do this. We will then manually review your submission and publish it to the app store. If we reject your submission, you will be notified with a reason for the rejection. You can view your pending submissions on the My Plugins page.

Updating plugins

Once you have a plugin published, you can submit additional versions using the "Update" button on the plugin details card. You can submit new versions, or backfill old ones. Each update is subject to the same review process as new submissions. All versions of a plugin must have the same name, title, and access type (see metadata below).

Rules

We reserve the right to reject any submission for any reason. All app store submissions are subject to the following rules:

  1. Gem must be a COSMOS plugin that provides value and usability to the COSMOS community
  2. Submission must not fail a virus scan or be malicious in any way
  3. Gem must include a cover image and the required metadata fields listed in the table below

Gem format

Your gem must be a COSMOS plugin. We recommend using our generator when getting started.

Image

Your plugin must include a cover image, which displays in the plugin cards here. The default location is at public/store_img.png, but you can place the image anywhere in your gem as long as you set the openc3_store_image metadata field in your gemspec. Make sure that the path to the image is included in the s.files of your gemspec when you build the gem.

Metadata

Required fields

Field Location in gemspec (in order of precedence) Description
Name s.name Unique identifier for your plugin.
Example: "openc3-cosmos-tool-videoplayer"
Title s.metadata['openc3_store_title'] OR s.summary Short, user-friendly name for your plugin.
Example: "Video Player"
Description s.metadata['openc3_store_description'] OR s.description A few sentences describing what your plugin does.
Example: "This plugin provides COSMOS with an integrated video player capable of playing back most common video file types..."
Licenses s.licenses An array of the applicable software license(s) for your gem.
Note: Must be compatible with COSMOS (cannot be copyleft like AGPL).
Example: ['MIT', 'BSD']
Keywords s.metadata['openc3_store_keywords'] A comma delimited list of keywords to help search for your plugin.
Example: "video, streaming"
Homepage s.homepage The URL to the homepage for your plugin (can be its repository page in github, or another website).
Example: "https://github.com/OpenC3/openc3-cosmos-tool-videoplayer"
Version s.version The semver version of your gem.
Example: "1.2.3"

Optional fields

Field Location in gemspec Description
Repository s.metadata['source_code_uri'] A link to the source code for your plugin.
Example: "https://github.com/OpenC3/openc3-cosmos-tool-videoplayer"
Default: none
Minimum COSMOS Version s.metadata['openc3_minimum_cosmos_version'] The minimum version of COSMOS your plugin is compatible with.
Example: "6.10.0"
Default: "5.0.0"
Access type s.metadata['openc3_store_access_type'] Who can access your plugin ("public" means everyone can access it, "enterprise" means customers of COSMOS Enterprise can access it, and "allowlist" means only a specific list of people can access it).
You must be an Enterprise user to submit an "enterprise" plugin.
Please contact us prior to submitting an "allowlist" plugin.
Example: "enterprise"
Default: "public"
Image path s.metadata['openc3_store_image'] The path to the cover image file in your gem. This field can be omitted if you store your image at the default path (`public/store_img.png`), but you must set it if your cover image is stored somewhere else.
Example: "img/cover.jpg"
Default: "public/store_img.png"

Example gemspec

(This is truncated to omit fields that are not relevant to the app store submission, but might be required for building your gem.)

spec = Gem::Specification.new do |s|
  s.name = 'openc3-cosmos-tool-videoplayer'
  s.summary = 'Video Player Tool for OpenC3 COSMOS' # Overridden by openc3_store_title
  s.description = 'This plugin adds the COSMOS Video Player tool' # Overridden by openc3_store_description
  s.homepage = 'https://github.com/OpenC3/openc3-cosmos-tool-videoplayer'
  s.licenses = ['MIT']
  s.files = Dir.glob("{targets,lib,procedures,public,tools,microservices}/**/*") + %w(Rakefile LICENSE.txt README.md plugin.txt)

  s.metadata = {
    "source_code_uri" => "https://github.com/OpenC3/openc3-cosmos-tool-videoplayer",
    "openc3_store_title" => "Video Player",
    "openc3_store_description" => "This plugin provides COSMOS with an integrated video player capable of playing back most common video file types, as well as HLS streams. Included is the top-level tool and a widget that can be used in TlmViewer screens.",
    "openc3_store_keywords" => "video, streaming",
    "openc3_store_image" => "public/store_img.png",
    "openc3_store_access_type" => "public",
    "openc3_cosmos_minimum_version" => "6.10.0"
  }
  
  # ...
end