{"id":"ff077b7a-5feb-46e2-a6d6-2b49aa108468","shortId":"zBqSaL","kind":"skill","title":"litestar-build","tagline":"Auto-activate for uv build, hatch build, pyapp, Hatchling force-include, bundled frontend assets, PyApp onefile binaries, GitHub Actions build matrices, PYAPP_* env vars, cargo-zigbuild, or python-build-standalone. Use when packaging Litestar apps as wheels, onefile binaries, rel","description":"# litestar-build\n\nBuild-side packaging patterns for Litestar applications: how to produce a **self-contained wheel** that embeds the Vite/Bun frontend, how to wrap that wheel in a **PyApp onefile** binary, and how to wire the whole pipeline into **GitHub Actions** CI and releases.\n\nThis skill is the counterpart to [litestar-deployment](../litestar-deployment/SKILL.md) — build is about producing artifacts, deployment is about running them.\n\n## The Core Idea: One Wheel, Self-Contained\n\nA Litestar wheel is the single source of truth for a release. It contains:\n\n- Python code (`src/py/app/` or `app/`)\n- SQL migrations, Jinja templates, INI configs\n- The **built** Vite/Bun frontend bundle (JS, CSS, HTML, images)\n- Email templates rendered from React/MJX to static HTML\n\nOnce produced, that wheel can be:\n\n1. `pip install`ed into a container (litestar-deployment).\n2. Wrapped in a **PyApp** binary (`dist/<app>`, `dist/app-x86_64-linux-gnu`) for zero-dep distribution.\n3. Uploaded to PyPI or a private index.\n\nAll three paths assume the wheel is **already complete** — no `bun run build` happens at deploy/install time.\n\n### Why bundle assets into the wheel (and not serve from a CDN)\n\n| Property | Bundled wheel | External CDN |\n| --- | --- | --- |\n| Deploy artifacts | 1 (`.whl` or binary) | 2+ (wheel + CDN upload) |\n| Version alignment | Atomic — API and UI lock-step | Easy to skew; rollback is painful |\n| PyApp onefile | Required — the binary embeds the wheel | Not possible — binary can't fetch CDN URLs at install time |\n| Offline/air-gapped | Works | Doesn't |\n| Dev server startup | Instant (files on disk next to package) | Fine |\n| Frontend-only deploys | Rebuild + redeploy wheel | Push to CDN only |\n\nFor **most Litestar apps that ship as a product** (CLIs, internal tools, enterprise installers), bundled-in-wheel is correct. Projects like [litestar-fullstack-inertia](#example-projects) and [litestar-fullstack](#example-projects) all bundle.\n\n### Why litestar-vite configs look the way they do in reference apps\n\nThis is the piece most developers miss. The Vite/litestar-vite configs in the reference apps are **deliberately set up so the Vite output lands inside the Python package directory** — because that's what makes the wheel pick them up automatically.\n\n**litestar-fullstack** (`src/js/web/vite.config.ts`):\n\n```ts\nexport default defineConfig({\n  build: {\n    outDir: path.resolve(__dirname, \"../../py/app/server/static/web\"),  // ← inside src/py/app/ (the Python package)\n    emptyOutDir: true,\n  },\n  plugins: [\n    litestar({\n      bundleDir: path.resolve(__dirname, \"../../py/app/server/static/web\"),\n      hotFile: path.resolve(__dirname, \"../../py/app/server/static/web/hot\"),\n    }),\n  ],\n})\n```\n\n**litestar-fullstack-inertia** — the litestar-vite plugin resolves `bundle_dir` relative to the project root, and Python settings point it at a package-internal path:\n\n```python\n# app/lib/settings.py\nreturn ViteConfig(\n    paths=PathConfig(\n        root=BASE_DIR.parent,\n        bundle_dir=Path(\"app/domain/web/public\"),   # ← inside app/ (the Python package)\n        resource_dir=Path(\"resources\"),\n    ),\n)\n```\n\n**Advanced reference pattern** — same approach: Vite and the offline-report build write to `src/py/<app>/server/public/` and `src/py/<app>/domain/web/static/reports/offline/`, both under the package root.\n\nContrast with a naïve `vite build` that writes to `./dist/` at the repo root: those files are **outside** the package directory listed in `[tool.hatch.build.targets.wheel] packages = [...]`, so Hatchling silently drops them. The wheel ships without a frontend.\n\nRule: **Vite's `outDir` and litestar-vite's `bundle_dir` must point inside one of the Python packages that Hatchling is told to include.** Everything else flows from that.\n\n## Quick Reference\n\n| Topic | Reference | Key Commands |\n| --- | --- | --- |\n| Wheel build + asset bundling | [references/wheel-assets.md](references/wheel-assets.md) | `uv build --wheel`, `[tool.hatch.build.targets.wheel.force-include]`, `ignore-vcs = true` |\n| PyApp — simple (hatch-binary) | [references/pyapp-simple.md](references/pyapp-simple.md) | `uv run hatch build --target binary` |\n| PyApp — advanced (offline + custom install dir) | [references/pyapp-advanced.md](references/pyapp-advanced.md) | `tools/bundler.py build`, `cargo zigbuild` |\n| GitHub Actions CI (test matrix) | [references/github-ci.md](references/github-ci.md) | `astral-sh/setup-uv@v7`, `oven-sh/setup-bun@v2`, composite actions |\n| GitHub Actions release | [references/github-release.md](references/github-release.md) | matrix onefiles, `cargo-zigbuild`, `gh release create` |\n| Upgrading Python / PyApp | [references/upgrading.md](references/upgrading.md) | Files to edit in sync |\n\n## Canonical Makefile Build Graph\n\nEvery Litestar app with bundled assets has some variant of this:\n\n```makefile\n.PHONY: install build-assets build-wheel build-onefile\n\ninstall:                          ## Install Python + JS deps\n\t@uv sync --all-groups\n\t@cd src/js/web && bun install --frozen-lockfile\n\nbuild-assets:                     ## Build frontend into the Python package\n\t@uv run app assets install\n\t@uv run app assets build\n\nbuild-wheel: build-assets         ## Self-contained Python wheel\n\t@uv build --wheel\n\nbuild-onefile: build-wheel        ## Single-file PyApp binary\n\t@./tools/scripts/build-onefile-package.sh\n```\n\nThe dependency chain is **load-bearing**: `build-onefile` depends on `build-wheel`, which depends on `build-assets`. Running them out of order produces an empty or broken artifact.\n\n### The two-variant story\n\nReal projects have multiple JS build outputs that all need to land in the wheel:\n\n```makefile\njs-build-all: js-build-web js-build-offline-report\nbuild-wheel: generate-licenses build-templates js-build-all\n\t@uv build --wheel\n```\n\nEach `js-build-*` target emits into a distinct subdirectory of the Python package (`src/py/<app>/server/public`, `src/py/<app>/domain/web/static/reports/offline`, etc.). Because they're all inside the package, a single `uv build --wheel` captures everything.\n\n<workflow>\n\n## Workflow\n\n### Step 1: Point Vite output inside the Python package\n\nOpen `vite.config.ts`. Set `build.outDir` to an absolute path inside your Python package (`src/py/<pkg>/...` or `<pkg>/...`). Set `litestar({ bundleDir, hotFile })` to the same path. **Do not** let Vite default to `./dist/`.\n\n### Step 2: Choose a Hatchling bundling strategy\n\n- **`force-include`** (inertia): List the built-asset directory explicitly under `[tool.hatch.build.targets.wheel.force-include]`. Built assets stay `.gitignore`d. Explicit, auditable.\n- **`ignore-vcs = true`** (SPA): Tell Hatchling to ignore `.gitignore`. All package files ship. Simpler; requires discipline to keep dev junk out of package dirs.\n\nSee [references/wheel-assets.md](references/wheel-assets.md) for full config.\n\n### Step 3: Wire Makefile targets\n\nCreate `install`, `build-assets`, `build-wheel`. Make the wheel target **depend** on the asset target. Add any secondary generators (`build-templates`, `generate-licenses`) as additional wheel prerequisites.\n\n### Step 4: Add PyApp (if shipping a binary)\n\nDecide which flavor:\n\n- **Simple**: add `[tool.hatch.build.targets.binary]` to pyproject.toml and run `uv run hatch build --target binary`. Good when end-users have PyPI access. See [pyapp-simple.md](references/pyapp-simple.md).\n- **Advanced**: write a `tools/bundler.py` that pre-installs deps into a `python-build-standalone` archive, patches PyApp's `src/app.rs` for a custom install dir, then runs `cargo zigbuild`. Good for air-gapped distribution or bespoke install locations. See [pyapp-advanced.md](references/pyapp-advanced.md).\n\n### Step 5: Add GitHub Actions CI\n\nStart with a reusable `test.yml` that accepts `python-version` + `coverage` inputs. Call it from `ci.yml` across a matrix. Use `astral-sh/setup-uv@v7` and `oven-sh/setup-bun@v2`. See [github-ci.md](references/github-ci.md).\n\nFor larger projects, factor `setup-python` and `setup-node` into `.github/actions/` composite actions.\n\n### Step 6: Add release workflow\n\nTrigger on `v*` tags. Run the test matrix first. Then build the wheel once. Then build PyApp onefiles in a per-target matrix (`x86_64-unknown-linux-gnu`, `aarch64-unknown-linux-gnu`, Apple, Windows). Upload to `gh release create`. See [github-release.md](references/github-release.md).\n\n</workflow>\n\n<guardrails>\n\n## Guardrails\n\n- **Vite/bun output must land inside a Python package directory.** Otherwise Hatchling drops it. Set `build.outDir` and `litestar({ bundleDir })` to an absolute path under `src/py/<pkg>/` or `<pkg>/`.\n- **`uv build` runs last.** Assets, licenses, templates, OpenAPI TypeGen all run **before** `uv build --wheel`. Hatchling can't build Vite itself.\n- **Pick one bundling strategy.** `force-include` or `ignore-vcs = true`, not both. Mixing them causes duplicate-file warnings and unpredictable wheel contents.\n- **PyApp envs are build-time, not runtime.** `PYAPP_PROJECT_NAME`, `PYAPP_PYTHON_VERSION`, `PYAPP_DISTRIBUTION_EMBED` are consumed when `cargo build` compiles PyApp — not when the resulting binary runs. Setting them at runtime does nothing.\n- **PyApp version upgrades touch multiple files.** `pyproject.toml`, `build-onefile-package.sh`, `.github/workflows/release.yml`, `tools/bundler.py`. See [upgrading.md](references/upgrading.md).\n- **`cargo-zigbuild` for portable glibc.** Plain `cargo build` on a modern Linux runner produces binaries that fail on older distros (glibc too new). Use `cargo zigbuild --target x86_64-unknown-linux-gnu.2.17` to link against glibc 2.17 (CentOS 7-era). Required for broad compatibility.\n- **Static-link native deps in PyApp.** Set `BZIP2_SYS_STATIC=1` and `LZMA_API_STATIC=1` before `cargo zigbuild`, or patch `Cargo.toml` to add `features = [\"static\"]`. Otherwise the onefile fails to load on systems without matching `libbz2.so` / `liblzma.so`.\n- **Pin `uv` and `bun` versions in CI.** Use exact pinned versions (e.g., `UV_VERSION=0.11.6` and `BUN_INSTALL_VERSION=bun-v1.3.12`). Drift in either breaks reproducible builds.\n- **Create placeholder asset dirs in CI.** Hatchling's wheel target fails if `app/domain/web/public` or `src/py/app/server/static/web` doesn't exist at wheel-build time. CI jobs that don't build the frontend (lint, mypy, pyright) still need `mkdir -p <asset-dir>` before `uv sync`.\n- **Never commit built frontend output.** Keep `bundle_dir` paths in `.gitignore`. CI rebuilds them on every run. Reason: JS builds are non-deterministic across machines and cause noisy diffs.\n- **Coverage on one Python version only.** Multiple versions uploading the same `coverage.xml` silently stomp each other. Pin it to one version in your matrix (`if: matrix.python-version == '3.12'`).\n- **Disk cleanup on self-hosted runners.** GitHub's `ubuntu-latest` has ~30GB free; building wheels + PyApp + Docker images can blow past that. Aggressive cleanup before the build job is routine.\n\n</guardrails>\n\n<validation>\n\n## Validation Checkpoint\n\nBefore claiming \"the wheel builds\":\n\n- [ ] `make build-wheel` succeeds in a clean checkout (after `make install`)\n- [ ] `unzip -l dist/*.whl | grep -E '\\.(js|css|html)$'` shows the built frontend\n- [ ] The wheel installs cleanly (`uv pip install dist/*.whl` in a fresh venv)\n- [ ] `python -c \"import app; app.run()\"` (or equivalent) serves assets with no extra steps\n- [ ] `.gitignore` excludes the built asset directory\n- [ ] Vite's `build.outDir` is an absolute path inside a Python package dir\n- [ ] Hatchling config uses exactly one of `force-include` OR `ignore-vcs = true`\n\nBefore claiming \"the PyApp binary works\":\n\n- [ ] `dist/<app> --help` runs on the build machine\n- [ ] The binary is ≥ 50 MB (much smaller means it's not embedding Python)\n- [ ] On Linux, `ldd dist/<app>` shows ≤ libc / libm / libpthread (no `libbz2`, no `liblzma`)\n- [ ] A network-isolated `docker run --rm --network=none ghcr.io/.../distroless -- <app> --help` succeeds (proves no runtime PyPI fetches)\n- [ ] The install dir (`~/.<app>/runtime/` or similar) is created on first run and re-used on second run\n\nBefore claiming \"CI works\":\n\n- [ ] Python matrix covers minimum + stable + latest (e.g., 3.11, 3.12, 3.13)\n- [ ] `make build-wheel` runs in CI and the resulting wheel is uploaded as an artifact\n- [ ] Pre-commit / ruff / mypy / pyright / slotscheck run on every PR\n- [ ] Release workflow is gated on CI (`needs: [lint, test]`)\n- [ ] A tag push produces wheel + onefiles + GitHub release in one run\n\n</validation>\n\n## Example Projects\n\nEverything in this skill is distilled from three production projects. Read these for the full picture:\n\n- **[litestar-fullstack-inertia](https://github.com/litestar-org/litestar-fullstack-inertia)** — monolithic `app/` layout, Inertia.js + React 19, `force-include` bundling, `hatch build --target binary` for 4-platform PyApp.\n- **[litestar-fullstack](https://github.com/litestar-org/litestar-fullstack)** — nested `src/py/app/` + `src/js/web/` layout, React + TanStack Router SPA, `ignore-vcs = true` bundling, React Email templates.\n\n## Official References\n\n- <https://ofek.dev/pyapp/> — PyApp documentation (all `PYAPP_*` env vars)\n- <https://github.com/ofek/pyapp> — PyApp source (patch target: `src/app.rs`)\n- <https://hatch.pypa.io/latest/config/build/> — Hatchling build config\n- <https://hatch.pypa.io/latest/plugins/builder/binary/> — Hatch binary builder (simple PyApp)\n- <https://docs.astral.sh/uv/concepts/projects/build/> — `uv build` reference\n- <https://github.com/astral-sh/python-build-standalone/releases> — Portable Python archives\n- <https://github.com/rust-cross/cargo-zigbuild> — cargo-zigbuild for portable glibc\n- <https://bun.sh/docs/cli/install> — Bun install and lockfile\n\n## Cross-References\n\n- [litestar-deployment](../litestar-deployment/SKILL.md) — runtime deployment (Dockerfiles, K8s, Railway, Cloud Run, systemd) that consumes the artifacts this skill produces\n- [litestar-vite](../litestar-vite/SKILL.md) — Vite plugin config (asset pipeline details, TypeGen, HMR)\n- [litestar-granian](../litestar-granian/SKILL.md) — Granian ASGI server (what the wheel's entry-point starts)\n- [litestar settings](../litestar-settings/references/settings.md) — env-driven `@dataclass` settings that work both in-wheel and as a PyApp binary\n\n## Shared Styleguide Baseline\n\n- [General Principles](../litestar-styleguide/references/general.md)\n- [Python](../litestar-styleguide/references/python.md)\n- [CI/CD](../litestar-styleguide/references/ci-cd.md)\n- [Litestar](../litestar-styleguide/references/litestar.md)","tags":["litestar","build","skills","litestar-org","advanced-alchemy","agent-skills","agentskills","ai-agents","claude-code-plugin","claude-code-skills","gemini-cli-extension","htmx"],"capabilities":["skill","source-litestar-org","skill-litestar-build","topic-advanced-alchemy","topic-agent-skills","topic-agentskills","topic-ai-agents","topic-claude-code-plugin","topic-claude-code-skills","topic-gemini-cli-extension","topic-htmx","topic-inertia","topic-litestar","topic-mcp","topic-python"],"categories":["litestar-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/litestar-org/litestar-skills/litestar-build","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add litestar-org/litestar-skills","source_repo":"https://github.com/litestar-org/litestar-skills","install_from":"skills.sh"}},"qualityScore":"0.453","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 7 github stars · SKILL.md body (14,575 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:13:53.353Z","embedding":null,"createdAt":"2026-05-18T13:20:56.589Z","updatedAt":"2026-05-18T19:13:53.353Z","lastSeenAt":"2026-05-18T19:13:53.353Z","tsv":"'/.../distroless':1679 '/../py/app/server/static/web':408,421 '/../py/app/server/static/web/hot':425 '/astral-sh/python-build-standalone/releases':1872 '/dist':508,895 '/docs/cli/install':1887 '/domain/web/static/reports/offline':493,841 '/latest/config/build/':1852 '/latest/plugins/builder/binary/':1858 '/litestar-deployment/skill.md':104,1898 '/litestar-granian/skill.md':1929 '/litestar-org/litestar-fullstack)**':1814 '/litestar-org/litestar-fullstack-inertia)**':1790 '/litestar-settings/references/settings.md':1943 '/litestar-styleguide/references/ci-cd.md':1969 '/litestar-styleguide/references/general.md':1965 '/litestar-styleguide/references/litestar.md':1971 '/litestar-styleguide/references/python.md':1967 '/litestar-vite/skill.md':1917 '/ofek/pyapp':1844 '/pyapp/':1835 '/runtime':1690 '/rust-cross/cargo-zigbuild':1878 '/server/public':490,839 '/setup-bun':626,1103 '/setup-uv':621,1097 '/tools/scripts/build-onefile-package.sh':741 '/uv/concepts/projects/build/':1866 '0.11.6':1394 '1':171,238,859,1352,1357 '19':1796 '2':181,242,897 '2.17':1328,1333 '3':194,956 '3.11':1716 '3.12':1402,1507,1717 '3.13':1718 '30gb':1521 '4':992,1806 '5':1069 '50':1646 '6':1124 '64':1153,1323 '7':1335 'aarch64':1159 'aarch64-unknown-linux-gnu':1158 'absolut':873,1194,1609 'accept':1080 'access':1022 'across':1090,1474 'action':24,91,612,629,631,1072,1122 'activ':6 'add':977,993,1003,1070,1125,1365 'addit':988 'advanc':475,600,1026 'aggress':1532 'air':1058 'air-gap':1057 'align':247 'all-group':687 'alreadi':209 'api':249,1355 'app':42,141,309,356,370,467,659,708,713,1588,1792 'app.run':1589 'app/domain/web/public':465,1421 'app/lib/settings.py':455 'appl':1163 'applic':58 'approach':479 'archiv':1041,1875 'artifact':109,237,773,1734,1910 'asgi':1931 'asset':19,221,573,662,673,699,709,714,721,762,911,918,964,975,1203,1411,1593,1602,1921 'assum':205 'astral':619,1095 'astral-sh':618,1094 'atom':248 'audit':923 'auto':5 'auto-activ':4 'automat':395 'base_dir.parent':461 'baselin':1962 'bear':748 'bespok':1062 'binari':22,46,81,186,241,265,271,590,598,740,998,1014,1273,1309,1634,1644,1804,1860,1959 'blow':1529 'break':1406 'broad':1339 'broken':772 'build':3,9,11,25,36,50,52,105,214,404,486,504,572,578,596,608,655,672,675,678,698,700,715,717,720,728,731,734,750,755,761,784,797,801,805,809,815,819,822,827,853,963,966,982,1012,1039,1138,1143,1200,1212,1217,1249,1266,1302,1408,1430,1437,1469,1523,1536,1546,1549,1641,1721,1802,1854,1868 'build-asset':671,697,719,760,962 'build-onefil':677,730,749 'build-onefile-package.sh':1288 'build-sid':51 'build-templ':814,981 'build-tim':1248 'build-wheel':674,716,733,754,808,965,1548,1720 'build.outdir':870,1188,1606 'builder':1861 'built':149,910,917,1452,1570,1601 'built-asset':909 'bun':212,692,1383,1396,1400,1888 'bun-v1':1399 'bun.sh':1886 'bun.sh/docs/cli/install':1885 'bundl':17,152,220,232,321,343,436,462,544,574,661,901,1222,1456,1800,1827 'bundled-in-wheel':320 'bundledir':418,883,1191 'bzip2':1349 'c':1586 'call':1086 'canon':653 'captur':855 'cargo':31,609,638,1053,1265,1295,1301,1319,1359,1880 'cargo-zigbuild':30,637,1294,1879 'cargo.toml':1363 'caus':1236,1477 'cd':690 'cdn':230,235,244,275,304 'cento':1334 'chain':744 'checkout':1555 'checkpoint':1541 'choos':898 'ci':92,613,1073,1386,1414,1432,1461,1707,1725,1751 'ci.yml':1089 'ci/cd':1968 'claim':1543,1631,1706 'clean':1554,1575 'cleanup':1509,1533 'clis':315 'cloud':1904 'code':138 'command':570 'commit':1451,1737 'compat':1340 'compil':1267 'complet':210 'composit':628,1121 'config':147,348,366,954,1617,1855,1920 'consum':1263,1908 'contain':65,122,136,177,724 'content':1244 'contrast':499 'core':116 'correct':325 'counterpart':99 'cover':1711 'coverag':1084,1480 'coverage.xml':1491 'creat':642,960,1169,1409,1694 'cross':1893 'cross-refer':1892 'css':154,1566 'custom':602,1048 'd':921 'dataclass':1947 'decid':999 'default':402,893 'defineconfig':403 'deliber':372 'dep':192,684,1034,1345 'depend':743,752,758,972 'deploy':103,110,180,236,298,1897,1900 'deploy/install':217 'detail':1923 'determinist':1473 'dev':284,943 'develop':362 'diff':1479 'dir':437,463,472,545,604,948,1050,1412,1457,1615,1689 'directori':384,519,912,1182,1603 'dirnam':407,420,424 'disciplin':940 'disk':290,1508 'dist':187,1561,1579,1636,1659 'dist/app-x86_64-linux-gnu':188 'distil':1773 'distinct':832 'distribut':193,1060,1260 'distro':1314 'docker':1526,1672 'dockerfil':1901 'docs.astral.sh':1865 'docs.astral.sh/uv/concepts/projects/build/':1864 'document':1837 'doesn':282,1424 'drift':1403 'driven':1946 'drop':527,1185 'duplic':1238 'duplicate-fil':1237 'e':1564 'e.g':1391,1715 'easi':255 'ed':174 'edit':650 'either':1405 'els':561 'email':157,1829 'emb':68,266,1261 'embed':1654 'emit':829 'empti':770 'emptyoutdir':414 'end':1018 'end-us':1017 'enterpris':318 'entri':1938 'entry-point':1937 'env':28,1246,1840,1945 'env-driven':1944 'equival':1591 'era':1336 'etc':842 'everi':657,1465,1744 'everyth':560,856,1768 'exact':1388,1619 'exampl':333,340,1766 'example-project':332,339 'exclud':1599 'exist':1426 'explicit':913,922 'export':401 'extern':234 'extra':1596 'factor':1111 'fail':1311,1371,1419 'featur':1366 'fetch':274,1686 'file':288,514,648,738,936,1239,1286 'fine':294 'first':1136,1696 'flavor':1001 'flow':562 'forc':15,904,1225,1623,1798 'force-includ':14,903,1224,1622,1797 'free':1522 'fresh':1583 'frontend':18,71,151,296,534,701,1439,1453,1571 'frontend-on':295 'frozen':695 'frozen-lockfil':694 'full':953,1782 'fullstack':330,338,398,428,1786,1811 'gap':1059 'gate':1749 'general':1963 'generat':812,980,985 'generate-licens':811,984 'gh':640,1167 'ghcr.io':1678 'ghcr.io/.../distroless':1677 'github':23,90,611,630,1071,1515,1761 'github-ci.md':1106 'github-release.md':1171 'github.com':1789,1813,1843,1871,1877 'github.com/astral-sh/python-build-standalone/releases':1870 'github.com/litestar-org/litestar-fullstack)**':1812 'github.com/litestar-org/litestar-fullstack-inertia)**':1788 'github.com/ofek/pyapp':1842 'github.com/rust-cross/cargo-zigbuild':1876 'github/actions':1120 'github/workflows/release.yml':1289 'gitignor':920,933,1460,1598 'glibc':1299,1315,1332,1884 'gnu':1157,1162,1327 'good':1015,1055 'granian':1928,1930 'graph':656 'grep':1563 'group':689 'guardrail':1173 'happen':215 'hatch':10,589,595,1011,1801,1859 'hatch-binari':588 'hatch.pypa.io':1851,1857 'hatch.pypa.io/latest/config/build/':1850 'hatch.pypa.io/latest/plugins/builder/binary/':1856 'hatchl':13,525,555,900,930,1184,1214,1415,1616,1853 'help':1637,1680 'hmr':1925 'host':1513 'hotfil':422,884 'html':155,164,1567 'idea':117 'ignor':583,925,932,1229,1627,1824 'ignore-vc':582,924,1228,1626,1823 'imag':156,1527 'import':1587 'in-wheel':1952 'includ':16,559,581,905,916,1226,1624,1799 'index':201 'inertia':331,429,906,1787 'inertia.js':1794 'ini':146 'input':1085 'insid':380,409,466,548,847,863,875,1178,1611 'instal':173,278,319,603,670,680,681,693,710,961,1033,1049,1063,1397,1558,1574,1578,1688,1889 'instant':287 'intern':316,452 'isol':1671 'jinja':144 'job':1433,1537 'js':153,683,783,796,800,804,818,826,1468,1565 'js-build':825 'js-build-al':795,817 'js-build-offline-report':803 'js-build-web':799 'junk':944 'k8s':1902 'keep':942,1455 'key':569 'l':1560 'land':379,790,1177 'larger':1109 'last':1202 'latest':1519,1714 'layout':1793,1818 'ldd':1658 'let':891 'libbz2':1665 'libbz2.so':1378 'libc':1661 'liblzma':1667 'liblzma.so':1379 'libm':1662 'libpthread':1663 'licens':813,986,1204 'like':327 'link':1330,1343 'lint':1440,1753 'linux':1156,1161,1306,1326,1657 'list':520,907 'litestar':2,41,49,57,102,124,179,308,329,337,346,397,417,427,432,541,658,882,1190,1785,1810,1896,1915,1927,1941,1970 'litestar-build':1,48 'litestar-deploy':101,178,1895 'litestar-fullstack':336,396,1809 'litestar-fullstack-inertia':328,426,1784 'litestar-granian':1926 'litestar-vit':345,431,540,1914 'load':747,1373 'load-bear':746 'locat':1064 'lock':253 'lock-step':252 'lockfil':696,1891 'look':349 'lzma':1354 'machin':1475,1642 'make':389,968,1547,1557,1719 'makefil':654,668,794,958 'match':1377 'matric':26 'matrix':615,635,1092,1135,1151,1503,1710 'matrix.python':1505 'mb':1647 'mean':1650 'migrat':143 'minimum':1712 'miss':363 'mix':1234 'mkdir':1445 'modern':1305 'monolith':1791 'much':1648 'multipl':782,1285,1486 'must':546,1176 'mypi':1441,1739 'name':1255 'nativ':1344 'naïv':502 'need':788,1444,1752 'nest':1815 'network':1670,1675 'network-isol':1669 'never':1450 'new':1317 'next':291 'node':1118 'noisi':1478 'non':1472 'non-determinist':1471 'none':1676 'noth':1280 'ofek.dev':1834 'ofek.dev/pyapp/':1833 'offici':1831 'offlin':484,601,806 'offline-report':483 'offline/air-gapped':280 'older':1313 'one':118,549,1221,1482,1499,1620,1764 'onefil':21,45,80,262,636,679,732,751,1145,1370,1760 'open':867 'openapi':1206 'order':767 'otherwis':1183,1368 'outdir':405,538 'output':378,785,862,1175,1454 'outsid':516 'oven':624,1101 'oven-sh':623,1100 'p':1446 'packag':40,54,293,383,413,451,470,497,518,523,553,705,837,849,866,878,935,947,1181,1614 'package-intern':450 'pain':260 'past':1530 'patch':1042,1362,1847 'path':204,453,458,464,473,874,888,1195,1458,1610 'path.resolve':406,419,423 'pathconfig':459 'pattern':55,477 'per':1149 'per-target':1148 'phoni':669 'pick':392,1220 'pictur':1783 'piec':360 'pin':1380,1389,1496 'pip':172,1577 'pipelin':88,1922 'placehold':1410 'plain':1300 'platform':1807 'plugin':416,434,1919 'point':446,547,860,1939 'portabl':1298,1873,1883 'possibl':270 'pr':1745 'pre':1032,1736 'pre-commit':1735 'pre-instal':1031 'prerequisit':990 'principl':1964 'privat':200 'produc':61,108,166,768,1308,1758,1913 'product':314,1776 'project':326,334,341,441,780,1110,1254,1767,1777 'properti':231 'prove':1682 'push':302,1757 'pyapp':12,20,27,79,185,261,586,599,645,739,994,1043,1144,1245,1253,1256,1259,1268,1281,1347,1525,1633,1808,1836,1839,1845,1863,1958 'pyapp-advanced.md':1066 'pyapp-simple.md':1024 'pypi':197,1021,1685 'pyproject.toml':1006,1287 'pyright':1442,1740 'python':35,137,382,412,444,454,469,552,644,682,704,725,836,865,877,1038,1082,1114,1180,1257,1483,1585,1613,1655,1709,1874,1966 'python-build-standalon':34,1037 'python-vers':1081 'quick':565 'railway':1903 're':845,1700 're-us':1699 'react':1795,1819,1828 'react/mjx':161 'read':1778 'real':779 'reason':1467 'rebuild':299,1462 'redeploy':300 'refer':355,369,476,566,568,1832,1869,1894 'references/github-ci.md':616,617,1107 'references/github-release.md':633,634,1172 'references/pyapp-advanced.md':605,606,1067 'references/pyapp-simple.md':591,592,1025 'references/upgrading.md':646,647,1293 'references/wheel-assets.md':575,576,950,951 'rel':47 'relat':438 'releas':94,134,632,641,1126,1168,1746,1762 'render':159 'repo':511 'report':485,807 'reproduc':1407 'requir':263,939,1337 'resolv':435 'resourc':471,474 'result':1272,1728 'return':456 'reusabl':1077 'rm':1674 'rollback':258 'root':442,460,498,512 'router':1821 'routin':1539 'ruff':1738 'rule':535 'run':113,213,594,707,712,763,1008,1010,1052,1132,1201,1209,1274,1466,1638,1673,1697,1704,1723,1742,1765,1905 'runner':1307,1514 'runtim':1252,1278,1684,1899 'second':1703 'secondari':979 'see':949,1023,1065,1105,1170,1291 'self':64,121,723,1512 'self-contain':63,120,722 'self-host':1511 'serv':227,1592 'server':285,1932 'set':373,445,869,881,1187,1275,1348,1942,1948 'setup':1113,1117 'setup-nod':1116 'setup-python':1112 'sh':620,625,1096,1102 'share':1960 'ship':311,531,937,996 'show':1568,1660 'side':53 'silent':526,1492 'similar':1692 'simpl':587,1002,1862 'simpler':938 'singl':128,737,851 'single-fil':736 'skew':257 'skill':96,1771,1912 'skill-litestar-build' 'slotscheck':1741 'smaller':1649 'sourc':129,1846 'source-litestar-org' 'spa':928,1822 'sql':142 'src/app.rs':1045,1849 'src/js/web':691,1817 'src/js/web/vite.config.ts':399 'src/py':489,492,838,840,879,1197 'src/py/app':139,410,1816 'src/py/app/server/static/web':1423 'stabl':1713 'standalon':37,1040 'start':1074,1940 'startup':286 'static':163,1342,1351,1356,1367 'static-link':1341 'stay':919 'step':254,858,896,955,991,1068,1123,1597 'still':1443 'stomp':1493 'stori':778 'strategi':902,1223 'styleguid':1961 'subdirectori':833 'succeed':1551,1681 'sync':652,686,1449 'sys':1350 'system':1375 'systemd':1906 'tag':1131,1756 'tanstack':1820 'target':597,828,959,971,976,1013,1150,1321,1418,1803,1848 'tell':929 'templat':145,158,816,983,1205,1830 'test':614,1134,1754 'test.yml':1078 'three':203,1775 'time':218,279,1250,1431 'told':557 'tool':317 'tool.hatch.build.targets.binary':1004 'tool.hatch.build.targets.wheel':522 'tool.hatch.build.targets.wheel.force':580,915 'tools/bundler.py':607,1029,1290 'topic':567 'topic-advanced-alchemy' 'topic-agent-skills' 'topic-agentskills' 'topic-ai-agents' 'topic-claude-code-plugin' 'topic-claude-code-skills' 'topic-gemini-cli-extension' 'topic-htmx' 'topic-inertia' 'topic-litestar' 'topic-mcp' 'topic-python' 'touch':1284 'trigger':1128 'true':415,585,927,1231,1629,1826 'truth':131 'ts':400 'two':776 'two-vari':775 'typegen':1207,1924 'ubuntu':1518 'ubuntu-latest':1517 'ui':251 'unknown':1155,1160,1325 'unknown-linux-gnu':1154,1324 'unpredict':1242 'unzip':1559 'upgrad':643,1283 'upgrading.md':1292 'upload':195,245,1165,1488,1731 'url':276 'use':38,1093,1318,1387,1618,1701 'user':1019 'uv':8,577,593,685,706,711,727,821,852,1009,1199,1211,1381,1392,1448,1576,1867 'v':1130 'v1':1401 'v2':627,1104 'v7':622,1098 'valid':1540 'var':29,1841 'variant':665,777 'vcs':584,926,1230,1628,1825 'venv':1584 'version':246,1083,1258,1282,1384,1390,1393,1398,1484,1487,1500,1506 'vite':347,377,433,480,503,536,542,861,892,1218,1604,1916,1918 'vite.config.ts':868 'vite/bun':70,150,1174 'vite/litestar-vite':365 'viteconfig':457 'warn':1240 'way':351 'web':802 'wheel':44,66,76,119,125,168,207,224,233,243,268,301,323,391,530,571,579,676,718,726,729,735,756,793,810,823,854,967,970,989,1140,1213,1243,1417,1429,1524,1545,1550,1573,1722,1729,1759,1935,1954 'wheel-build':1428 'whl':239,1562,1580 'whole':87 'window':1164 'wire':85,957 'without':532,1376 'work':281,1635,1708,1950 'workflow':857,1127,1747 'wrap':74,182 'write':487,506,1027 'x86':1152,1322 'zero':191 'zero-dep':190 'zigbuild':32,610,639,1054,1296,1320,1360,1881","prices":[{"id":"de8c8dcc-f212-45b1-af00-8bfa15a70f72","listingId":"ff077b7a-5feb-46e2-a6d6-2b49aa108468","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"litestar-org","category":"litestar-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:20:56.589Z"}],"sources":[{"listingId":"ff077b7a-5feb-46e2-a6d6-2b49aa108468","source":"github","sourceId":"litestar-org/litestar-skills/litestar-build","sourceUrl":"https://github.com/litestar-org/litestar-skills/tree/main/skills/litestar-build","isPrimary":false,"firstSeenAt":"2026-05-18T13:20:56.589Z","lastSeenAt":"2026-05-18T19:13:53.353Z"}],"details":{"listingId":"ff077b7a-5feb-46e2-a6d6-2b49aa108468","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"litestar-org","slug":"litestar-build","github":{"repo":"litestar-org/litestar-skills","stars":7,"topics":["advanced-alchemy","agent-skills","agentskills","ai-agents","claude-code-plugin","claude-code-skills","gemini-cli-extension","htmx","inertia","litestar","mcp","python","sqlspec"],"license":"mit","html_url":"https://github.com/litestar-org/litestar-skills","pushed_at":"2026-05-13T16:04:09Z","description":"Opinionated first-party agent skills, plugins, subagents, slash commands, and MCP servers for the Litestar framework ecosystem — publishable to Claude Code, Gemini CLI, Codex CLI, Cursor, OpenCode, and VS Code/Copilot from a single repo.","skill_md_sha":"1cd01edbdff4331ca5f712979979c6d73d5ed41f","skill_md_path":"skills/litestar-build/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/litestar-org/litestar-skills/tree/main/skills/litestar-build"},"layout":"multi","source":"github","category":"litestar-skills","frontmatter":{"name":"litestar-build","description":"Auto-activate for uv build, hatch build, pyapp, Hatchling force-include, bundled frontend assets, PyApp onefile binaries, GitHub Actions build matrices, PYAPP_* env vars, cargo-zigbuild, or python-build-standalone. Use when packaging Litestar apps as wheels, onefile binaries, release artifacts, or asset-bundled distributions. Not for runtime deployment - use litestar-deployment."},"skills_sh_url":"https://skills.sh/litestar-org/litestar-skills/litestar-build"},"updatedAt":"2026-05-18T19:13:53.353Z"}}