{"id":17043620,"url":"https://github.com/m0rf30/yap","last_synced_at":"2026-05-26T23:12:29.635Z","repository":{"id":65752575,"uuid":"583798243","full_name":"M0Rf30/yap","owner":"M0Rf30","description":"Package software with ease 📦 Versatile deb, rpm and apk packager fueled by PKGBUILD specfiles and golang","archived":false,"fork":false,"pushed_at":"2025-04-07T14:03:08.000Z","size":702,"stargazers_count":8,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-12T15:11:38.743Z","etag":null,"topics":["abuild","alpine-packages","apk","arch-linux-packages","artifacts","deb","debian-packages","dpkg","makepkg","packages","pacman","rhel-packages","rpm","universal-packager","yet-another-packager"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/M0Rf30.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-12-31T00:34:43.000Z","updated_at":"2025-04-07T14:03:07.000Z","dependencies_parsed_at":"2023-10-14T21:01:16.257Z","dependency_job_id":"7228afb4-d2a5-4d77-a05d-41e3cf056865","html_url":"https://github.com/M0Rf30/yap","commit_stats":null,"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/M0Rf30%2Fyap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/M0Rf30%2Fyap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/M0Rf30%2Fyap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/M0Rf30%2Fyap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/M0Rf30","download_url":"https://codeload.github.com/M0Rf30/yap/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248586244,"owners_count":21128998,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["abuild","alpine-packages","apk","arch-linux-packages","artifacts","deb","debian-packages","dpkg","makepkg","packages","pacman","rhel-packages","rpm","universal-packager","yet-another-packager"],"created_at":"2024-10-14T09:30:02.303Z","updated_at":"2026-05-26T23:12:29.594Z","avatar_url":"https://github.com/M0Rf30.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# YAP — Yet Another Packager\n\n![yap-logo](assets/images/logo.png)\n\n[![report card](https://img.shields.io/badge/report%20card-a%2B-ff3333.svg?style=flat-square)](http://goreportcard.com/report/M0Rf30/yap)\n[![View examples](https://img.shields.io/badge/learn%20by-examples-0077b3.svg?style=flat-square)](examples)\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat-square)](https://www.gnu.org/licenses/gpl-3.0)\n[![Go Report Card](https://goreportcard.com/badge/github.com/M0Rf30/yap?style=flat-square)](https://goreportcard.com/report/github.com/M0Rf30/yap)\n[![GitHub release](https://img.shields.io/github/release/M0Rf30/yap.svg?style=flat-square)](https://github.com/M0Rf30/yap/releases/latest)\n\nYAP builds native packages for multiple GNU/Linux distributions from a single PKGBUILD specification. Write your package once; get `.deb`, `.rpm`, `.apk`, and `.pkg.tar.zst` out. All builds run in isolated OCI containers (Docker or Podman).\n\n## Features\n\n- **Multi-format output**: DEB (Debian/Ubuntu), RPM (Fedora/RHEL/Rocky/openSUSE), APK (Alpine), TAR.ZST (Arch)\n- **Container isolation**: reproducible builds, no host contamination, Docker and Podman supported\n- **PKGBUILD-based**: familiar Arch Linux syntax extended with distribution and architecture overrides\n- **Cross-compilation**: build for a different architecture than your host\n- **Dependency-aware builds**: sequential by default; opt-in parallel topo-sort via `--parallel`\n- **Package signing**: APK RSA + DEB/RPM/Pacman GPG (no `gpg` binary required)\n- **SBOM generation**: CycloneDX 1.5 and SPDX 2.3 sidecars\n- **Per-format compression**: `zstd`/`gzip`/`xz` for DEB and RPM\n- **Changelog support**: `changelog` PKGBUILD field renders to native format per distro\n- **Pacman scriptlets**: full 6-hook lifecycle (pre/post install/upgrade/remove)\n- **Structured logging**: slog-based, tree rendering for long lines, zero external UI deps\n\n## Installation\n\n```bash\nwget https://github.com/M0Rf30/yap/releases/latest/download/yap_Linux_x86_64.tar.gz\ntar -xzf yap_Linux_x86_64.tar.gz\nsudo mv yap /usr/local/bin/\nyap version\n```\n\n### Build from source\n\n```bash\ngit clone https://github.com/M0Rf30/yap.git\ncd yap\nmake build\nsudo mv yap /usr/local/bin/\n```\n\nRequires Docker or Podman:\n\n```bash\n# Docker\nsudo systemctl enable --now docker \u0026\u0026 sudo usermod -aG docker $USER\n\n# Podman\nsudo systemctl enable --now podman\n```\n\n## Quick start\n\n### 1. Project structure\n\nCreate `yap.json`:\n\n```json\n{\n  \"name\": \"My Package\",\n  \"description\": \"A sample package built with YAP\",\n  \"buildDir\": \"/tmp/yap-build\",\n  \"output\": \"artifacts\",\n  \"projects\": [\n    { \"name\": \"my-package\" }\n  ]\n}\n```\n\n### 2. PKGBUILD\n\nCreate `my-package/PKGBUILD`:\n\n```bash\npkgname=my-package\npkgver=1.0.0\npkgrel=1\npkgdesc=\"My awesome application\"\narch=('x86_64')\nlicense=('GPL-3.0')\nurl=\"https://github.com/user/my-package\"\nmakedepends=('gcc' 'make')\nsource=(\"https://github.com/user/my-package/archive/v${pkgver}.tar.gz\")\nsha256sums=('SKIP')\n\nbuild() {\n    cd \"${srcdir}/${pkgname}-${pkgver}\"\n    make\n}\n\npackage() {\n    cd \"${srcdir}/${pkgname}-${pkgver}\"\n    install -Dm755 my-package \"${pkgdir}/usr/bin/my-package\"\n    install -Dm644 README.md \"${pkgdir}/usr/share/doc/${pkgname}/README.md\"\n}\n```\n\n### 3. Build\n\n```bash\n# Auto-detect host distro from /etc/os-release\nyap build .\n\n# Specific distribution\nyap build ubuntu-jammy .\nyap build fedora-38 /path/to/project\nyap build --cleanbuild --nomakedeps ubuntu-jammy .\n```\n\n### 4. Output\n\n```\nartifacts/\n├── my-package_1.0.0-1_amd64.deb\n├── my-package-1.0.0-1.x86_64.rpm\n├── my-package-1.0.0-r1.apk\n└── my-package-1.0.0-1-x86_64.pkg.tar.zst\n```\n\n## Project configuration (`yap.json`)\n\n```json\n{\n  \"name\": \"My Multi-Package Project\",\n  \"description\": \"Project description\",\n  \"buildDir\": \"/tmp/yap-builds\",\n  \"output\": \"dist\",\n  \"cleanPrevious\": true,\n  \"projects\": [\n    { \"name\": \"package-one\", \"depends\": [] },\n    { \"name\": \"package-two\", \"depends\": [\"package-one\"] }\n  ]\n}\n```\n\n| Field | Default | Description |\n|-------|---------|-------------|\n| `name` | — | Project display name |\n| `description` | — | Project description |\n| `buildDir` | `/tmp` | Temporary build directory |\n| `output` | `artifacts` | Output directory for built packages |\n| `cleanPrevious` | `false` | Clean previous builds before starting |\n| `projects` | — | Array of packages to build |\n| `depends` | — | Build-time ordering dependencies |\n\n## PKGBUILD extensions\n\n### Distribution-specific variables\n\nUse `__` (double underscore) to override any variable per distribution. Priority (highest wins):\n\n| Priority | Syntax | Example |\n|----------|--------|---------|\n| 4+ | arch + distro | `depends_x86_64__ubuntu_noble` |\n| 4 | arch only | `depends_x86_64` |\n| 3 | distro + codename | `depends__ubuntu_noble` |\n| 2 | distro | `depends__ubuntu` |\n| 1 | package manager | `depends__apt` |\n| 0 | base (fallback) | `depends` |\n\n```bash\npkgdesc=\"My application\"\npkgdesc__debian=\"My application for Debian/Ubuntu\"\npkgdesc__ubuntu_noble=\"My application optimized for Ubuntu 24.04\"\n\nmakedepends=('gcc' 'make')\nmakedepends__apt=('build-essential' 'cmake')\nmakedepends__yum=('gcc-c++' 'cmake3')\nmakedepends__ubuntu_noble=('build-essential' 'cmake' 'pkg-config' 'libtool')\n```\n\n### Architecture-specific variables\n\n```bash\ndepends=('glibc' 'gcc')\ndepends_x86_64=('glibc' 'gcc' 'lib32-glibc')\ndepends_aarch64=('glibc' 'gcc' 'aarch64-linux-gnu-gcc')\n\nsource=('https://example.com/generic-source.tar.gz')\nsource_x86_64=('https://example.com/x86_64-optimized.tar.gz')\nsource_aarch64=('https://example.com/aarch64-source.tar.gz')\n\nsha256sums=('generic_hash')\nsha256sums_x86_64=('x86_64_specific_hash')\nsha256sums_aarch64=('aarch64_specific_hash')\n```\n\nSupported architectures: `x86_64`, `i686`, `aarch64`, `armv7h`, `armv6h`, `armv5`, `ppc64`, `ppc64le`, `s390x`, `mips`, `mipsle`, `riscv64`, `pentium4`, `any`.\n\n### Checksum types\n\nSupported (strongest to fastest): `b2sums`, `sha512sums`, `sha384sums`, `sha256sums`, `sha224sums`, `cksums`.\n\n```bash\n# BLAKE2b (recommended)\nb2sums=('2f240f2a3d2f8d8f...')\n\n# CRC32 (format: checksum filesize)\ncksums=('1234567890 2048576')\n```\n\n### Changelog\n\n```bash\nchangelog=CHANGELOG.md\n```\n\n- **DEB**: `usr/share/doc/\u003cpkgname\u003e/changelog.Debian.gz` (Lintian-compliant)\n- **Pacman**: `.CHANGELOG` in the archive\n- **APK**: ignored (no Alpine convention)\n- **RPM**: deferred (rpmpack API gap)\n\n### Pacman scriptlets\n\n```bash\npre_install()  { echo \"Before install\"; }\npost_install() { systemctl daemon-reload; }\npre_upgrade()  { systemctl stop myservice; }\npost_upgrade() { systemctl start myservice; }\npre_remove()   { systemctl disable myservice; }\npost_remove()  { systemctl daemon-reload; }\n```\n\nEmitted to `\u003cpkgname\u003e.install` only when at least one hook is defined. `pre/post_upgrade` fall back to `pre/post_install` when absent.\n\n### Package manager-specific fields\n\n```bash\n# DEB\nsection=utils\npriority=optional\n\n# RPM\ngroup=\"Applications/System\"\nrequires_pre=('shadow-utils')\n\n# APK\nmaintainer=\"John Doe \u003cjohn@example.com\u003e\"\n```\n\n## Supported distributions\n\n| Distribution ID | Format | Package Manager |\n|-----------------|--------|-----------------|\n| `almalinux` | `.rpm` | yum |\n| `alpine` | `.apk` | apk |\n| `amzn` | `.rpm` | yum |\n| `arch` | `.pkg.tar.zst` | pacman |\n| `centos` | `.rpm` | yum |\n| `debian` | `.deb` | apt |\n| `fedora` | `.rpm` | dnf |\n| `linuxmint` | `.deb` | apt |\n| `opensuse-leap` | `.rpm` | zypper |\n| `opensuse-tumbleweed` | `.rpm` | zypper |\n| `ol` | `.rpm` | yum |\n| `pop` | `.deb` | apt |\n| `rhel` | `.rpm` | yum |\n| `rocky` | `.rpm` | yum |\n| `ubuntu` | `.deb` | apt |\n\n## CLI reference\n\n### Commands\n\n```bash\nyap build [distro[-release]] \u003cpath\u003e   # Build packages (distro auto-detected if omitted)\nyap zap [distro] \u003cpath\u003e               # Clean build environment\nyap prepare [distro[-release]]        # Prepare host build environment\nyap pull \u003cdistro\u003e                     # Pull pre-built container images\nyap install \u003cartifact-file\u003e           # Install a built artifact\nyap graph [path]                      # Show dependency graph\nyap list-distros                      # List supported distributions\nyap status                            # Show host status and runtime detection\nyap version                           # Show version information\nyap completion \u003cshell\u003e                # Generate shell completion (bash/zsh/fish/powershell)\n```\n\n### Build flags\n\n```bash\n# Build behavior\n--cleanbuild              # Clean srcdir before build\n--nobuild                 # Download sources only\n--zap                     # Deep clean staging directory\n\n# Dependencies\n--nomakedeps              # Skip makedeps installation\n--skip-sync               # Skip package manager sync\n--parallel                # Enable parallel topo-sort (opt-in)\n\n# Version\n--pkgver 1.2.3            # Override package version\n--pkgrel 2                # Override release number\n\n# Range\n--from package1           # Start from specific package\n--to package5             # Stop at specific package\n--only pkg1,pkg2          # Build only listed packages\n\n# Cross-compilation\n--target-arch arm64       # Cross-compile for target architecture\n--skip-toolchain-validation\n\n# Signing\n--sign                    # Enable artifact signing\n--sign-key /path/to/key   # Private key path\n--sign-passphrase pass    # Passphrase (prefer env: YAP_SIGN_PASSPHRASE)\n--sign-key-name mykey     # APK key name\n\n# SBOM\n--sbom                    # Generate SBOM sidecars\n--sbom-format cyclonedx   # CycloneDX 1.5 only\n--sbom-format spdx        # SPDX 2.3 only\n--sbom-format both        # Both (default)\n\n# Compression\n--compression-deb gzip    # DEB: zstd|gzip|xz (default: zstd)\n--compression-rpm xz      # RPM: zstd|gzip|xz (default: zstd)\n\n# Debug\n--debug-dir /path         # Emit split debug info\n--verbose                 # Verbose logging\n--no-color                # Disable colored output\n```\n\n### Shell completion\n\n```bash\nyap completion bash \u003e /etc/bash_completion.d/yap\nyap completion zsh \u003e /usr/share/zsh/site-functions/_yap\nyap completion fish \u003e ~/.config/fish/completions/yap.fish\nyap completion powershell \u003e yap.ps1\n```\n\n## Package signing\n\n| Format | Algorithm | Output |\n|--------|-----------|--------|\n| APK | RSA PKCS#1 v1.5 SHA1 | `.SIGN.RSA.\u003ckeyname\u003e.rsa.pub` embedded stream |\n| DEB | OpenPGP | `\u003cpackage\u003e.deb.asc` (ASCII-armored detached) |\n| RPM | OpenPGP | `\u003cpackage\u003e.rpm.asc` + optional in-RPM via rpmpack |\n| Pacman | OpenPGP | `\u003cpackage\u003e.pkg.tar.zst.sig` (binary detached) |\n\nSigning uses `github.com/ProtonMail/go-crypto/openpgp` — no `gpg` binary required.\n\n### Key resolution (highest to lowest)\n\n1. `--sign-key \u003cpath\u003e` CLI flag\n2. Format env: `YAP_APK_KEY`, `YAP_DEB_KEY`, `YAP_RPM_KEY`, `YAP_PACMAN_KEY`\n3. Global env: `YAP_SIGN_KEY`\n4. `yap.json` field `signing.keyPath`\n5. `~/.config/yap/keys/\u003cformat\u003e.{rsa,gpg}` then `~/.config/yap/keys/default.{rsa,gpg}`\n\nPassphrase resolution mirrors key resolution with `_PASSPHRASE` suffix.\n\n### yap.json signing config\n\n```json\n{\n  \"signing\": {\n    \"enabled\": true,\n    \"keyPath\": \"~/.config/yap/keys/release.gpg\",\n    \"keyName\": \"release\"\n  }\n}\n```\n\n### Verifying signed packages\n\n```bash\n# APK (after distributing the public key to /etc/apk/keys/)\napk add my-package.apk\n\n# DEB\ngpg --verify my-package_1.0.0_amd64.deb.asc my-package_1.0.0_amd64.deb\n\n# RPM\nrpm -K my-package-1.0.0-1.x86_64.rpm\n\n# Pacman\npacman-key --verify my-package-1.0.0-1-x86_64.pkg.tar.zst.sig\n```\n\n## SBOM generation\n\n```bash\nyap build --sbom .                        # Both formats (default)\nyap build --sbom --sbom-format cyclonedx .\nyap build --sbom --sbom-format spdx .\n```\n\nOutput alongside each artifact:\n\n```\nartifacts/\n└── my-package_1.0.0-1_amd64.deb\n    my-package_1.0.0-1_amd64.deb.cdx.json   ← CycloneDX 1.5\n    my-package_1.0.0-1_amd64.deb.spdx.json  ← SPDX 2.3\n```\n\nCaptured: name, version, license, runtime/build deps, source URLs and checksums, file hashes, DESCRIBES/DEPENDS_ON relationships.\n\n## Advanced usage\n\n### Cross-compilation\n\n```bash\nyap build --target-arch=aarch64 ubuntu-jammy .\nyap build --target-arch=armv7 fedora-38 .\nyap build --target-arch=i686 alpine .\nyap build --target-arch=ppc64le arch .\n```\n\nYAP installs the required cross-compilation toolchains and configures the build environment automatically.\n\n### Multi-package projects\n\n```json\n{\n  \"name\": \"My Suite\",\n  \"projects\": [\n    { \"name\": \"core-library\", \"install\": true },\n    { \"name\": \"main-application\", \"install\": true },\n    { \"name\": \"plugins\", \"install\": false }\n  ]\n}\n```\n\nPackages with `\"install\": true` are installed immediately after building so subsequent packages can use them as build-time dependencies.\n\n```bash\n# Sequential (default) — explicit ordering via \"install\" field\nyap build .\n\n# Parallel — topo-sort + worker pool\nyap build --parallel .\n```\n\n### Build environment preparation\n\n```bash\nyap prepare                    # Auto-detect host distro\nyap prepare ubuntu-jammy\nyap prepare fedora-38\nyap prepare --golang arch\nyap prepare --skip-sync rocky-9\n```\n\n### CI/CD integration\n\n#### GitHub Actions\n\n```yaml\nname: Build Packages\non: [push, pull_request]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Install YAP\n        run: |\n          wget https://github.com/M0Rf30/yap/releases/latest/download/yap_Linux_x86_64.tar.gz\n          tar -xzf yap_Linux_x86_64.tar.gz\n          sudo mv yap /usr/local/bin/\n\n      - name: Build Packages\n        run: yap build\n\n      - name: Upload Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: packages\n          path: artifacts/\n```\n\n#### GitLab CI\n\n```yaml\nbuild-packages:\n  stage: build\n  image: ubuntu:22.04\n  before_script:\n    - apt-get update \u0026\u0026 apt-get install -y wget docker.io\n    - wget https://github.com/M0Rf30/yap/releases/latest/download/yap_Linux_x86_64.tar.gz\n    - tar -xzf yap_Linux_x86_64.tar.gz \u0026\u0026 mv yap /usr/local/bin/\n  script:\n    - yap build\n  artifacts:\n    paths:\n      - artifacts/\n    expire_in: 1 week\n```\n\n## Examples\n\nThe [examples](examples) directory contains complete, ready-to-build projects:\n\n| Example | Description |\n|---------|-------------|\n| [circular-deps](examples/circular-deps) | Circular dependency detection — YAP fails with a clear error |\n| [dependency-orchestration](examples/dependency-orchestration) | 5-package project with automatic dep resolution and build ordering |\n| [yap](examples/yap) | YAP packaging itself — Go application with install scripts |\n| [split-package](examples/split-package) | One build producing multiple installable packages with distro overrides |\n| [multi-architecture](examples/multi-architecture) | Architecture-specific sources, deps, and checksums |\n\n## PKGBUILD examples\n\n### Simple C application\n\n```bash\npkgname=hello-world\npkgver=1.0.0\npkgrel=1\npkgdesc=\"A simple Hello World program\"\narch=('x86_64')\nlicense=('MIT')\nmakedepends=('gcc')\nsource=(\"hello.c\")\nsha256sums=('SKIP')\n\nbuild() { gcc -o hello hello.c; }\n\npackage() { install -Dm755 hello \"${pkgdir}/usr/bin/hello\"; }\n```\n\n### Python application\n\n```bash\npkgname=python-myapp\npkgver=2.1.0\npkgrel=1\npkgdesc=\"My Python application\"\narch=('any')\nlicense=('Apache-2.0')\ndepends=('python3')\nmakedepends__apt=('python3-dev' 'python3-setuptools')\nmakedepends__yum=('python3-devel' 'python3-setuptools')\nsource=(\"https://pypi.io/packages/source/m/myapp/myapp-${pkgver}.tar.gz\")\nsha256sums=('...')\n\nbuild() {\n    cd \"${srcdir}/myapp-${pkgver}\"\n    python3 setup.py build\n}\n\npackage() {\n    cd \"${srcdir}/myapp-${pkgver}\"\n    python3 setup.py install --root=\"${pkgdir}\" --optimize=1\n}\n```\n\n### Web service with systemd\n\n```bash\npkgname=web-service\npkgver=1.5.0\npkgrel=1\npkgdesc=\"My web service\"\narch=('x86_64')\nlicense=('GPL-3.0')\ndepends=('systemd')\nbackup=('etc/web-service/config.yml')\nsource=(\"web-service-${pkgver}.tar.gz\" \"web-service.service\")\nsha256sums=('...' 'SKIP')\n\nbuild() {\n    cd \"${srcdir}/web-service-${pkgver}\"\n    make build\n}\n\npackage() {\n    cd \"${srcdir}/web-service-${pkgver}\"\n    install -Dm755 web-service \"${pkgdir}/usr/bin/web-service\"\n    install -Dm644 ../web-service.service \\\n        \"${pkgdir}/usr/lib/systemd/system/web-service.service\"\n    install -Dm644 config.yml \"${pkgdir}/etc/web-service/config.yml\"\n    install -dm755 \"${pkgdir}/var/lib/web-service\"\n    install -dm755 \"${pkgdir}/var/log/web-service\"\n}\n```\n\n## Development\n\n### Make targets\n\n```bash\nmake all              # clean, deps, fmt, lint, test, doc, build\nmake build            # build the yap binary\nmake build-all        # build for linux/darwin/windows, amd64/arm64\nmake clean            # clean build artifacts\nmake deps             # download and tidy Go modules\nmake fmt              # gofmt\nmake lint             # golangci-lint\nmake lint-md          # markdownlint\nmake test             # run all tests (-p 1 -v, sequential required)\nmake test-coverage    # tests with coverage report (coverage.html)\nmake release          # create release packages\n\nmake doc              # view all package documentation\nmake doc-serve        # start pkgsite on localhost:8080\nmake doc-generate     # generate static docs in docs/api/\nmake doc-package PKG=./pkg/builders/apk\n\nmake docker-build DISTRO=ubuntu\nmake docker-build-all\nmake docker-list-distros\n\nmake i18n-check       # verify localization file integrity\nmake i18n-stats       # localization statistics\n```\n\n### Testing\n\nTests must run sequentially (`-p 1`):\n\n```bash\nmake test\ngo test ./pkg/source -v\ngo test ./pkg/builders/deb -v\ngo test ./pkg/graph -v\ngo test -race ./pkg/builders/...\ngo test -timeout 30s ./pkg/download/...\n```\n\n### Internationalization\n\nSupported languages: English (`en`), Italian (`it`).\n\nLanguage is auto-detected from `LANG`/`LC_ALL`/`LC_MESSAGES`/`LANGUAGE`. Override with `--language` / `-l`:\n\n```bash\nyap --language=it build .\n```\n\nTo add a language: copy `pkg/i18n/locales/en.yaml` to `pkg/i18n/locales/{code}.yaml`, translate, add the code to `SupportedLanguages` in `pkg/i18n/i18n.go`, submit a PR.\n\n## Troubleshooting\n\n### Container runtime\n\n```bash\nsystemctl status docker       # or podman\ndocker run --rm hello-world   # test access\nsudo usermod -aG docker $USER # fix permissions (re-login required)\n```\n\n### Build failures\n\n```bash\nyap build --verbose\nyap zap ubuntu-jammy /path/to/project\nyap status\n```\n\n### Permission issues\n\n```bash\nsudo chown -R $USER:$USER artifacts/\nsetsebool -P container_manage_cgroup true   # SELinux (Red Hat family)\n```\n\n### Performance\n\n```bash\nyap build --skip-sync     # skip package manager sync\nyap build --cleanbuild    # clean source before build\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/my-feature`\n3. Make changes and add tests\n4. Run `make fmt lint test`\n5. Commit and open a pull request\n\nSee [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for community guidelines.\n\n## License\n\nGNU General Public License v3.0. See [LICENSE.md](LICENSE.md).\n\n## Credits\n\n- [Zachary Huff](https://github.com/zachhuff386) for contributions to Pacur, the project that inspired YAP\n- The Arch Linux community for the PKGBUILD format\n- All contributors\n\nBuilt with [Go](https://golang.org/), [Cobra](https://github.com/spf13/cobra), [Docker](https://www.docker.com/) / [Podman](https://podman.io/).\n\n---\n\n[Report issues](https://github.com/M0Rf30/yap/issues) · [Discussions](https://github.com/M0Rf30/yap/discussions) · [Wiki](https://github.com/M0Rf30/yap/wiki)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm0rf30%2Fyap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fm0rf30%2Fyap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm0rf30%2Fyap/lists"}