Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Melpa Status Melpa Stable Status Build Status Support me


This library provides a linter for the metadata in Emacs Lisp files which are intended to be packages. You can integrate it into your build process.

package-lint detects various issues that may make your package uninstallable or unusable for some users, and it warns about significant deviations from the Elisp coding conventions, such as non-compliant symbol naming, and use of reserved keybindings. Among other community uses, package-lint is a prerequisite for submission of packages to MELPA.

package-lint can be used standalone, but see also the flycheck-package and package-lint-flymake packages, which both use package-lint to conveniently display packaging errors directly in the buffer while writing elisp packages.


The recommended way to get package-lint is as a package from the MELPA repository. The version of package-lint there will always be up-to-date. There are also packages in MELPA Stable, which track the latest numbered tag.


Use the command package-lint-current-buffer interactively, or use package-lint-buffer if linting programmatically.

If you're a package author, you can include package-lint in your build process by ensuring that the package is installed, and then using the function package-lint-batch-and-exit to lint your files -- see in this repo for an example.


Additional checks for future versions:

  • WARN: header line formatting / capitalisation
  • trailing line presence / formatting
  • WARN: library is called *-mode but doesn't provide a major mode
  • checkdoc failures for interactive functions / defcustoms
  • trailing whitespace?
  • themes which aren't in a matching *-theme.el file
  • use of unsafe local variables
  • local variable set in header line
  • using commentary to talk about load[- ]path and installation
  • lack of autoloads
  • references to README files which won't be bundled in a package
  • use of CamelCase identifiers
  • Defining a -mode function directly instead of using define-derived-mode or define-minor-mode
  • Referring to display-graphic-p or window-system in -theme.el files


Please refer to the file LICENSE.


package-lint was written by Steve Purcell with significant contributions from Fanael Linithien.

Author links:

πŸ’ Support this project and my other Open Source work

πŸ’Ό LinkedIn profile


🐦 @sanityinc