Zoidberg Packaging Guidelines
Official standards and policies for packages in the Zoidberg registry.
This document defines the official packaging guidelines for Zoidberg, the primary Zoi package registry. These standards ensure that Zoi remains a high-quality, secure, and consistent ecosystem for developers across Linux, macOS, and Windows.
Packages submitted to the core, main, and extra tiers must adhere strictly to these guidelines.
1. Inclusion Policy & Tiers
Zoidberg is dedicated to high-quality software that enhances the developer and system environment.
1.1. Tier Definition
core: Essential packages and libraries. Very common, high stability, and well-maintained.main: Important packages that are essential for most users but don't fit incore.extra: Niche or specialized packages. Less common or less actively maintained.community: User-submitted packages. This is the starting point for most new submissions.test: For testing new Zoi features or packages before they graduate.archive: For software that is no longer maintained.
1.2. Licensing & Proprietary Software
- Open Source Preferred: Software in the
coreandmaintiers MUST be licensed under an OSI-approved open-source license. - Proprietary Consideration: Proprietary or "source-available" software may be considered for the
communityorextratiers provided it is legally redistributable and clearly states its restrictions. - Prohibited Content: Packages containing malware, spyware, offensive content, or software primarily intended for illegal activities are strictly prohibited.
2. Build Methodology: Binary-First
Zoidberg follows a Binary-First, Pragmatic Hybrid model.
2.1. Preference for Pre-compiled
To ensure fast and reliable installation for end-users, pre-compiled is the preferred build type. When available, a package should provide a pre-compiled type that downloads tested binaries from an upstream release.
2.2. Source Builds
Providing a source build type is highly encouraged as a secondary option. It provides transparency and allows for platform-specific optimizations.
2.3. Pragmatic Bundling (Vendoring)
- Shared Over Bundled: Prefer declaring dependencies via
zoi:,native:, or ecosystem-specific managers instead of bundling them inside your package. - Pragmatic Exception: Bundling (vendoring) is allowed when upstream makes it exceptionally difficult to separate dependencies, or for ecosystems where vendoring is the standard.
3. Naming & Versioning Standards
3.1. Flat Naming
Zoidberg uses a Flat Naming convention.
- Simplicity: Use the simplest, most common name for the software (e.g.
ripgrep, notrust-ripgrep). - Lowercase: All package names MUST be lowercase ASCII.
- Characters: Use only lowercase letters, digits, and hyphens (
-). Avoid underscores or periods. - Collision Handling: Collisions are handled on a case-by-case basis. If a name is already taken, prioritize the more popular or established tool.
3.2. Versioning (PKG.version)
The version field MUST match the upstream version verbatim.
- Prefixes: Strip any
vprefixes (e.g. use1.2.3instead ofv1.2.3). - SemVer: Follow SemVer patterns where possible.
3.3. Revisions (PKG.revision)
The revision field tracks downstream changes to the package definition itself.
- Increment if you fix a bug in the Lua script, update a dependency, or change a configuration file while the upstream version remains the same.
- Reset to
"1"whenever the upstreamversionis bumped.
4. Metadata & Quality Requirements
4.1. Required Fields
Every submission MUST include:
name: The flat package name.repo: The targeted tier.version: Upstream version.description: A concise, one-line summary.license: A valid SPDX license identifier.maintainer: Name and email of the package maintainer.
4.2. Recommended Testing
Implementing a test() lifecycle function is highly recommended for the core and main tiers, and strongly encouraged for all others. The test should verify that the binary executes correctly (e.g. running myapp --version).
function test()
local _, _, code = cmd("${pkgstore}/bin/myapp --version")
return code == 0
end5. Dependency Management
5.1. Manager Hierarchy
When resolving dependencies, use the following priority:
zoi:: For other Zoi-native packages.native:: For core system libraries (likeopenssl) to ensure host compatibility.- Language Managers: Use
npm:,cargo:,pip:, etc., for tools specific to those ecosystems.
5.2. No Direct Internet in Build/Package
Lifecycle functions like build() and package() SHOULD NOT access the internet. All downloads MUST happen in prepare().
6. Integration & Security
6.1. Shell Integration
Use the zshell() helper function to bundle completion scripts for Bash, Zsh, and Fish.
6.2. License Staging
Every package MUST stage its license text to the package store using the zlicense() helper.
function package()
-- Stage binary...
zcp("bin/tool", "${pkgstore}/bin/tool")
-- Stage license
zlicense("LICENSE")
end6.3. Security Verification
- Hashes Required: All
pre-compileddownloads MUST be verified usingverifyHash()with a strong algorithm (sha512orsha256). - Signatures: Use
verifySignature()with upstream PGP keys whenever available.
7. Submission Process
Before submitting a Merge Request:
- Linter: Run
zoi package doctoron your script. - Test: Run
zoi package testlocally. - Inspect: Run
zoi package inspect --jsonto verify resolved metadata.
For a detailed step-by-step on contributing, see the CONTRIBUTING.md.
2026 © All Rights Reserved.
- All the content is available under CC BY-SA 4.0, expect where otherwise stated.
- Source code is available on GitLab, licensed under Apache 2.0.
Last updated on
