This guide explains how to prepare and submit the Knocker extension to extensions.gnome.org.
- All JavaScript follows GNOME Shell Extension Guidelines
- No deprecated modules used (ByteArray, Lang, Mainloop)
- ES6+ modern JavaScript features used throughout
- Async/await used for asynchronous operations
- ESLint configured and all files pass linting
- No objects created during initialization (constructor)
- All objects created in
enable()are destroyed indisable() - All signals connected are disconnected in
disable() - All main loop sources are removed in
disable() - Proper cancellation handling for async operations
- No GTK/Gdk/Adw imports in
extension.js - No Clutter/Meta/St/Shell imports in
prefs.js - Proper separation of extension and preferences code
- Valid
metadata.jsonwith all required fields - UUID follows format:
name@domain.tld - Shell versions specified correctly (48, 49)
- URL points to GitHub repository
- Version number included
- GSettings schema compiles without errors
- Schema ID matches metadata settings-schema
- Schema path follows convention
- All keys have proper types and defaults
- README with clear description and installation
- LICENSE file (GPL-2.0-or-later)
- No excessive or unnecessary files
- All documentation under docs/ directory
- Extension tested on target GNOME Shell versions
- All features work as expected
- No errors in logs
- Proper enable/disable cycle
- CI/CD pipeline validates everything
-
Update version number in
metadata.json:{ "version": 1 } -
Build the package:
./build.sh
-
Verify the package:
unzip -l Knocker@fariszr.com.shell-extension.zip
Should contain:
extension.jsknockerService.jsknockerMonitor.jsknockerQuickSettings.jsprefs.jsmetadata.jsonstylesheet.cssschemas/directory with compiled schemaicons/directory with icon files
-
Test the package:
gnome-extensions install Knocker@fariszr.com.shell-extension.zip gnome-extensions enable Knocker@fariszr.com # Restart GNOME Shell and test
- Go to https://extensions.gnome.org/accounts/register/
- Create an account (requires email verification)
-
Fill in the form:
- Extension file: Upload the
.shell-extension.zip - Shell versions: Select 48 and 49
- Screenshot: Upload a screenshot of the extension in action
- Description: Copy from README.md
- URL: https://github.com/FarisZR/knocker-gnome
- Extension file: Upload the
-
Submit for review
- Extensions are reviewed by GNOME volunteers
- Review typically takes 1-4 weeks
- You'll receive email notifications about the review status
- Reviewers may request changes before approval
- Extension will be available on extensions.gnome.org
- Users can install it via the website or GNOME Extensions app
- You can upload new versions through the same process
-
Update version:
- Increment version in
metadata.json - Add entry to
CHANGELOG.md
- Increment version in
-
Create Git tag:
git tag -a v1.1.0 -m "Release version 1.1.0" git push origin v1.1.0 -
GitHub Actions will:
- Build the package automatically
- Create a GitHub release
- Attach the
.shell-extension.zipfile
-
Submit to extensions.gnome.org:
- Log in to your account
- Upload the new version
- Submit for review
Same process as new releases, but increment the patch version (e.g., 1.0.0 → 1.0.1).
- Unused imports
- Objects not destroyed in
disable() - Signals not disconnected
- Main loop sources not removed
- Excessive logging
- Including unnecessary files (build scripts, test files)
- Using deprecated modules
- ✅ CI/CD validates everything automatically
- ✅ ESLint catches unused imports
- ✅ Proper cleanup verified in code review
- ✅ Only necessary files included in package
- ✅ Modern JavaScript throughout
If you have questions about publishing:
- Check the GNOME Shell Extensions Review Guidelines
- Ask in the GNOME Extensions Matrix room
- Open an issue on GitHub