First of all, thanks for taking the time to contribute! This project can only grow and live by your countless contributions. To keep this project maintainable, we have developed some guidelines for our contributors.
devicon.json
Here are some terms that we will use in this repo:
SVG
" refers to the svg
versions of the Icons.Devicon only accepts Icons of development languages and tools.
Development refers to programming or programming-related jobs.
Tools can be software, OS, services, etc. that helps with development. It must be specifically related to development (so software like Microsoft Word or Google Calendar won't be accepted since it's too general).
Special Cases (see this discussion for more details)To request an icon, please create an issue in the repository, and follow these guidelines:
Here is what you have to do to submit your icons to the repo.
/icons
devicon.json
to include the new Icon develop
branch for each Icon.new icon: Icon name (versions)
peek-bot
to check your icons.Note: Due to our recent bot upgrades, icon contributors don't have to optimize/minify their SVGs anymore!
For the technology name, make the file and folder name lowercase and concatenate them. For example:
angularjs
or just angular
amazonwebservices
microsoftsqlserver
Each icon/SVG can come in different versions:
original: the original logo. Can contain multiple colors. devicon-original.svg |
plain: a one-color version of the original logo. Note that the icon version will be stripped of all colors so you don't have to strip beforehand. devicon-plain.svg |
line: a one-color, line version of the original logo. Note that the icon version will be stripped of all colors so you don't have to strip beforehand. devicon-line.svg |
original-wordmark: similar to the above but must contain the name of the technology. devicon-original-wordmark.svg |
plain-wordmark: similar to the above but must contain the name of the technology. Note that the icon version will be stripped of all colors so you don't have to strip beforehand. devicon-plain-wordmark.svg |
line-wordmark: similar to the above but must contain the name of the technology. Note that the icon version will be stripped of all colors so you don't have to strip beforehand. devicon-line-wordmark.svg |
Notes:
original
Before you submit your logos/SVGs, please ensure that they meet the following standard:
viewBox
.(Technology name)-(original|plain|line)(-wordmark?).
.svg
can have any color.
.svg
file contains one version of an icon in a 0 0 128 128
viewbox. You can use a service like resize-image for scaling the SVG..svg
must use the fill
attribute instead of using classes
for colors. This is to prevent class name clashing when using inline SVG. See here for more details.icons
folder. .svg
files for the Icon must go in the same folder. .eps
file. The .eps
file should contains all available versions of an icon. Each version is contained in a 128px by 128px artboarddevicon.json
Before you open a PR into Devicon, you must update the devicon.json
. This is essential for our build script to work and to document your work.
Here is the object that each of your Icon must have:
{
// the official name of the technology. Must be lower case, no space and don't have the dash '-' character.
"name": string,
// list of tags relating to the technology for search purpose
"tags": string[],
// keep tracks of the different versions that you have.
"versions": {
// list the SVGs that you have
"SVG": VersionString[],
// list the fonts acceptable versions that you have
"font": VersionString[]
},
// the main color of the logo. Only track 1 color
"color": string,
// keeps track of the aliases for the font versions ONLY
// see the Example section for more details
// NOTE: this attribute is not required from now on (see this)
// it is only being kept for backward compatibility
"aliases": AliasObj[]
}
Here is what VersionString means:
SVG
file's nameHere is the AliasObj interface:
{
"base": VersionString, // the base version
"alias": VersionString // the alias version that's similar to the base version
}
As an example, let's assume you have created the SVGs for Redhat and Amazon Web Services logos.
For the Redhat SVG, you have the "original", "original-wordmark", "plain", and "plain-wordmark" versions.
For the Amazon Web Services SVGs, you have the "original", "original-wordmark", "plain-wordmark" versions. The "original" version is simple enough to be a "plain" version as well. Note that we are not using the acronym AWS.
/icons
amazonwebservices
and one for redhat
devicon.json
redhat
, you would do this
{
"name": "redhat",
"tags": [
"server",
"linux"
],
"versions": {
"SVG": [ // here are the versions that are available in svgs
"original",
"original-wordmark",
"plain",
"plain-wordmark"
],
"font": [ // here are the versions that will be used to create icons
"plain",
"plain-wordmark"
]
},
"color": "#e93442", // note the '#' character
"aliases": [] // no aliases in this case
},
amazonwebservices
, you would do this
{
"name": "amazonwebservices",
"tags": [
"cloud",
"hosting",
"server"
],
"versions": {
"SVG": [ // here are the versions that are available in svgs
"original",
"original-wordmark",
"plain-wordmark"
],
"font": [ // here are the versions that will be used to create icons
"original", // "original" is simple enough to be used as the plain icon so we'll add "plain" to the aliases below
"plain-wordmark",
// note that the alias "plain" is not listed here. It must be listed in the `aliases` attribute
]
},
"color": "#F7A80D", // note the '#' character
"aliases": [
{
"base": "original", // here is the base version that we will upload to Icomoon
"alias": "plain" // this is its alias. Our script will create a reference so users can search using "original" or "plain" for this icon
// note that you don't provide aliases for the SVG version. If "original" can't be made into a font, there's no need to provide it with a plain alias
// note that this is now optional. You do not need to create aliases from now on. The attribute needs to stay though.
}
]
}
Sometimes, a company will update their logo or someone spotted an error in the SVG/icon that needs to be fixed. This means the current icon in our repository might need an update. The steps to do this is simple:
update icon: icon-name (versions)
. Basically, follow the Overview on Submitting Icon but replace the new
with update
in name of request with the above.
Devicon is living by it's contributors and maintainers. Everyone can and is asked to contribute to this project. You don't have to be in a team to contribute!
The branches master
and develop
are protected branches and only members
with corresponding permissions (see teams below) are able to push changes to them.
Additional branches must follow the pattern username/feature/description
.
The /feature/
indicates that a change is made to existing code (regardless
if it's a fix, refactor or actual feature). The naming convention is based on the gitflow-workflow.
For organisational purposes we introduced teams with permissions and responsibilities:
Write
access to the repository (allowing them to create own branches)
and are allowed to push changes to the develop
branch (pull request and status checks required).
Maintainer
permission
to the repository.
Members of this team are allowed to publish a new release (push master
branch after pull
request and status checks).
Wanna join the team? Please open a public discussion where
you introduce yourself.
New member requests have to be approved by all active members of the team Maintainer. Every member
of this team has a veto permission to reject a new member.
We rely on GitHub Actions, Python, Selenium, Imgur, and Gulp to automate our tasks. Please feel free to take a look at the workflow files. The codes should be clear enough to follow along.
Here are the main bots/script that we use:
peek-bot
: Upload the icons to Icomoon and see what it looks like. Doesn't download any icons at this time.build-bot
: Build the icons by uploading them to Icomoon and download the resulting icon files. Also update the css fileoptimize-bot
: Optimize the SVGs by minifying them and prefixing their IDs with the file names. This is done so using inline SVGs from this repository will not cause ID clash.check-SVG-bot
: Check the SVGs uploaded and ensure they have the correct view box, fills, etc..npm-release-bot
: Update the NPM package.release-message-bot
: Create the release message for the PR.Here are the modular tasks in the build script:
There are some bugs that the build scripts might run into. Listed below are the common ones and their solutions
package-lock.json
. Most likely the result of a dependabot update but not 100% sure.package-lock.json
and run `npm install` to generate a new file. Commit and push.bot-peek
script relies on the PR title to find the icon that was added in the PR. If the format doesn't match what is specified in Overview on Submitting Icon, the bot will fail.We are running a Discord server. You can go here to talk, discuss, and more with the maintainers and other people, too. Here's the invitation: https://discord.gg/hScy8KWACQ. If you don't have a GitHub account but want to suggest ideas or new icons, you can do that here in our Discord channel. The Discord server is unofficial, and Devicons is still being maintained via GitHub.
Devicon does not follow a strict release plan. A new release is depended on current amount of contributions, required bugfixes/patches and will be discussed by the team of maintainers.
Generally speaking: A new release will be published when new icons are added or a bug was fixed. When it's predictable that multiple icons are added in a foreseeable amount of time they are usually wrapped together.
The version naming follows the rules of Semantic Versioning. Given a version number MAJOR.MINOR.PATCH, increment the:
development
as draft-release
branchnpm version vMAJOR.MINOR.PATCH -m "bump npm version to vMAJOR.MINOR.PATCH"
(see #487
)draft-release
build_icons.yml
(which has a workflow_dispatch
event trigger) and select the branch draft-release
as target branch. This will build a font version of all icons using icomoon and automatically creates a pull request to merge the build result back into draft-release
development
. Mention the release number in the pull request title (like "Build preparation for release vMAJOR.MINOR.PATCH).
#504
as an example).
master
and HEAD development
. Copy the description of the earlier pull request.npm publish
leading to a updated npm package (vMAJOR.MINOR.PATCH).