All the options for packaging, signing, and encrypting a .vibeapp.
Basic packaging
vibe package vibe.yaml -o myapp.vibeapp
The output is a ZIP-based .vibeapp archive containing:
The vibe.yaml manifest
All referenced assets
Optional seed data (initial state)
With encryption
# Provide password on the command line (visible in shell history — avoid in CI)vibe package vibe.yaml -o myapp.vibeapp --password "my-secret-password"# Read password from a file (preferred)vibe package vibe.yaml -o myapp.vibeapp --password-file secrets/pw.txt# Omit --password to be prompted interactively (most secure)vibe package vibe.yaml -o myapp.vibeapp
Encrypted packages use AES-256-GCM with Argon2id key derivation (OWASP interactive profile: m=64 MiB, t=3, p=4).
With seed data
Seed data is a directory of pre-populated content that gets embedded as the app’s initial state. Each subdirectory becomes a signed _vibe_initial_state/<name>.tar.gz entry.
Use this to ship apps with pre-loaded databases, sample files, or other data that should be present on first run.
Signing
Always sign packages you distribute publicly:
# Generate a keypair (one-time setup)vibe keygen -o my-signing# Sign the packagevibe sign myapp.vibeapp --key my-signing.key# For encrypted packages, provide the password to signvibe sign myapp.vibeapp --key my-signing.key --password-file secrets/pw.txt
Keep my-signing.key private. Distribute my-signing.pub to users or embed it in the macOS host app for trusted verification.
Inspect before distributing
vibe inspect myapp.vibeapp
Shows the manifest contents, file listing, signature state, and whether encryption is present.
Verify the signature
vibe verify myapp.vibeapp --key my-signing.pub
Confirms the package hasn’t been tampered with.
Distributing without signing (dev mode)
During development you can skip signing. Recipients will see an “Unsigned (Dev Mode)” orange warning and must explicitly acknowledge running unsigned code.
Never distribute unsigned packages publicly. Always sign before sharing with end users.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Vibe","colors":{"primary":"#6366F1","light":"#818CF8","dark":"#4338CA"},"logo":"https://mintcdn.com/gilosher/QPE--U8upBZ9bMfc/logo.png?fit=max\u0026auto=format\u0026n=QPE--U8upBZ9bMfc\u0026q=85\u0026s=b3606820617ef3030b3d8168220e8922","favicon":"https://mintcdn.com/gilosher/QPE--U8upBZ9bMfc/favicon.svg?fit=max\u0026auto=format\u0026n=QPE--U8upBZ9bMfc\u0026q=85\u0026s=070addf68a460e8d45f5b9446a1d56f7","navbar":{"links":[{"href":"https://github.com/dolfin/vibe","type":"github"}],"primary":{"type":"button","label":"Download Vibe","href":"https://github.com/dolfin/vibe/releases"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"gilosher","hasAudioNarration":false,"actualSubdomain":"gilosher","customDomains":["docs.dotvibe.app"],"gitSource":{"type":"github","owner":"dolfin","repo":"vibe","deployBranch":"main","contentDirectory":"website","isPrivate":false,"mountPath":"","label":""},"entitlements":{},"buildId":"6ae94acaf034dd2525ac963d:success","clientVersion":"0.0.4131","searchFilterCounts":[{"language":"default","tag":"CLI Reference","count":11},{"language":"default","tag":"Manifest Reference","count":9},{"language":"default","tag":"Internals","count":6},{"language":"default","tag":"Security","count":6},{"language":"default","tag":"Getting Started","count":3},{"language":"default","tag":"Overview","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"getting-started/package-an-app","slug":"/getting-started/package-an-app","pageMetadata":{"title":"Package an App","description":"All the options for packaging, signing, and encrypting a .vibeapp.","href":"/getting-started/package-an-app"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"All the options for packaging, signing, and encrypting a .vibeapp.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`basic-packaging`,children:`Basic packaging`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`vibe`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` package`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` vibe.yaml`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -o`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` myapp.vibeapp`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The output is a ZIP-based `,_jsx(_components.code,{children:`.vibeapp`}),` archive containing:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.code,{children:`vibe.yaml`}),` manifest`]}),`\n`,_jsx(_components.li,{children:`All referenced assets`}),`\n`,_jsx(_components.li,{children:`Optional seed data (initial state)`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`with-encryption`,children:`With encryption`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Provide password on the command line (visible in shell history — avoid in CI)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`vibe`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` package`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` vibe.yaml`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -o`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` myapp.vibeapp`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --password`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"my-secret-password\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Read password from a file (preferred)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`vibe`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` package`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` vibe.yaml`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -o`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` myapp.vibeapp`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --password-file`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` secrets/pw.txt`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Omit --password to be prompted interactively (most secure)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`vibe`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` package`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` vibe.yaml`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -o`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` myapp.vibeapp`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Encrypted packages use `,_jsx(_components.strong,{children:`AES-256-GCM`}),` with `,_jsx(_components.strong,{children:`Argon2id`}),` key derivation (OWASP interactive profile: m=64 MiB, t=3, p=4).`]}),`\n`,_jsx(Heading,{level:`2`,id:`with-seed-data`,children:`With seed data`}),`\n`,_jsxs(_components.p,{children:[`Seed data is a directory of pre-populated content that gets embedded as the app’s initial state. Each subdirectory becomes a signed `,_jsx(_components.code,{children:`_vibe_initial_state/\u003cname>.tar.gz`}),` entry.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`vibe`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` package`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` vibe.yaml`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -o`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` myapp.vibeapp`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --seed-data`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ./initial-data/`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Use this to ship apps with pre-loaded databases, sample files, or other data that should be present on first run.`}),`\n`,_jsx(Heading,{level:`2`,id:`signing`,children:`Signing`}),`\n`,_jsx(_components.p,{children:`Always sign packages you distribute publicly:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Generate a keypair (one-time setup)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`vibe`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` keygen`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -o`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` my-signing`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Sign the package`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`vibe`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` sign`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` myapp.vibeapp`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --key`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` my-signing.key`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# For encrypted packages, provide the password to sign`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`vibe`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` sign`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` myapp.vibeapp`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --key`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` my-signing.key`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --password-file`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` secrets/pw.txt`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Keep `,_jsx(_components.code,{children:`my-signing.key`}),` private. Distribute `,_jsx(_components.code,{children:`my-signing.pub`}),` to users or embed it in the macOS host app for trusted verification.`]}),`\n`,_jsx(Heading,{level:`2`,id:`inspect-before-distributing`,children:`Inspect before distributing`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`vibe`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` inspect`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` myapp.vibeapp`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Shows the manifest contents, file listing, signature state, and whether encryption is present.`}),`\n`,_jsx(Heading,{level:`2`,id:`verify-the-signature`,children:`Verify the signature`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`vibe`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` verify`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` myapp.vibeapp`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --key`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` my-signing.pub`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Confirms the package hasn’t been tampered with.`}),`\n`,_jsx(Heading,{level:`2`,id:`distributing-without-signing-dev-mode`,children:`Distributing without signing (dev mode)`}),`\n`,_jsx(_components.p,{children:`During development you can skip signing. Recipients will see an “Unsigned (Dev Mode)” orange warning and must explicitly acknowledge running unsigned code.`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Never distribute unsigned packages publicly. Always sign before sharing with end users.`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Package an App","description":"All the options for packaging, signing, and encrypting a .vibeapp.","href":"/getting-started/package-an-app"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Basic packaging","slug":"basic-packaging","depth":2,"children":[]},{"title":"With encryption","slug":"with-encryption","depth":2,"children":[]},{"title":"With seed data","slug":"with-seed-data","depth":2,"children":[]},{"title":"Signing","slug":"signing","depth":2,"children":[]},{"title":"Inspect before distributing","slug":"inspect-before-distributing","depth":2,"children":[]},{"title":"Verify the signature","slug":"verify-the-signature","depth":2,"children":[]},{"title":"Distributing without signing (dev mode)","slug":"distributing-without-signing-dev-mode","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"gilosher","siteName":"Vibe","title":"Package an App - Vibe","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-03-24T23:53:20.099Z","originalFileLocation":"getting-started/package-an-app.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"All the options for packaging, signing, and encrypting a .vibeapp.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Vibe\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/gilosher/-p4j5psRmlt4KqMs/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/gilosher/-p4j5psRmlt4KqMs/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/gilosher/-p4j5psRmlt4KqMs/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/gilosher/-p4j5psRmlt4KqMs/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/gilosher/-p4j5psRmlt4KqMs/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/gilosher/-p4j5psRmlt4KqMs/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/gilosher/-p4j5psRmlt4KqMs/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/gilosher/-p4j5psRmlt4KqMs/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/gilosher/-p4j5psRmlt4KqMs/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Package an App - Vibe\">\u003cmeta data-mint-head property=\"og:description\" content=\"All the options for packaging, signing, and encrypting a .vibeapp.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Vibe\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.dotvibe.app/getting-started/package-an-app\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://gilosher.mintlify.site/_mintlify/api/og/v2?division=Getting+Started\u0026amp;title=Package+an+App\u0026amp;description=All+the+options+for+packaging%2C+signing%2C+and+encrypting+a+.vibeapp.\u0026amp;theme=041ac4e7b00df316da62c0ec\u0026amp;signature=88709387a1bc52a1e1362de9756969a338f408bf6596a0da7987f0d9019de679\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Package an App - Vibe\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"All the options for packaging, signing, and encrypting a .vibeapp.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://gilosher.mintlify.site/_mintlify/api/og/v2?division=Getting+Started\u0026amp;title=Package+an+App\u0026amp;description=All+the+options+for+packaging%2C+signing%2C+and+encrypting+a+.vibeapp.\u0026amp;theme=041ac4e7b00df316da62c0ec\u0026amp;signature=88709387a1bc52a1e1362de9756969a338f408bf6596a0da7987f0d9019de679\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/gilosher/-p4j5psRmlt4KqMs/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Vibe\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6366F1\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.dotvibe.app/getting-started/package-an-app\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/getting-started/package-an-app.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.dotvibe.app/#organization\",\"name\":\"Vibe\",\"url\":\"https://docs.dotvibe.app\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/gilosher/QPE--U8upBZ9bMfc/logo.png?fit=max\u0026auto=format\u0026n=QPE--U8upBZ9bMfc\u0026q=85\u0026s=b3606820617ef3030b3d8168220e8922\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.dotvibe.app#website\",\"name\":\"Vibe\",\"url\":\"https://docs.dotvibe.app\",\"publisher\":{\"@id\":\"https://docs.dotvibe.app/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.dotvibe.app/getting-started/package-an-app#webpage\",\"url\":\"https://docs.dotvibe.app/getting-started/package-an-app\",\"name\":\"Package an App\",\"description\":\"All the options for packaging, signing, and encrypting a .vibeapp.\",\"dateModified\":\"2026-03-24T23:53:20.099Z\",\"isPartOf\":{\"@id\":\"https://docs.dotvibe.app#website\"},\"breadcrumb\":{\"@id\":\"https://docs.dotvibe.app/getting-started/package-an-app#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.dotvibe.app/getting-started/package-an-app#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Getting Started\",\"item\":\"https://docs.dotvibe.app/getting-started/quickstart\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Package an App\",\"item\":\"https://docs.dotvibe.app/getting-started/package-an-app\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.dotvibe.app/getting-started/package-an-app#article\",\"headline\":\"Package an App\",\"name\":\"Package an App\",\"description\":\"All the options for packaging, signing, and encrypting a .vibeapp.\",\"url\":\"https://docs.dotvibe.app/getting-started/package-an-app\",\"mainEntityOfPage\":{\"@id\":\"https://docs.dotvibe.app/getting-started/package-an-app#webpage\"},\"dateModified\":\"2026-03-24T23:53:20.099Z\",\"publisher\":{\"@id\":\"https://docs.dotvibe.app/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.dotvibe.app#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Vibe\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Vibe\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/getting-started/package-an-app.md","siteName":"Vibe","nav":{"global":null,"groups":[{"group":"Overview","pages":[{"title":"Introduction","href":"/introduction"}]},{"group":"Getting Started","pages":[{"title":"Quickstart","href":"/getting-started/quickstart"},{"title":"Open an App","description":"What happens when you open a .vibeapp file on macOS.","href":"/getting-started/open-an-app"},{"title":"Package an App","href":"/getting-started/package-an-app"}]},{"group":"Manifest Reference","pages":[{"title":"Manifest Overview","description":"The vibe.yaml manifest describes your app's services, state, security, and metadata.","href":"/manifest/overview"},{"title":"Top-Level Fields","href":"/manifest/top-level-fields"},{"title":"services","href":"/manifest/services"},{"title":"state","href":"/manifest/state"},{"title":"security","href":"/manifest/security"},{"title":"secrets","href":"/manifest/secrets"},{"title":"ui","href":"/manifest/ui"},{"title":"publisher","href":"/manifest/publisher"},{"title":"Validation Rules","href":"/manifest/validation-rules"}]},{"group":"CLI Reference","pages":[{"title":"CLI Overview","href":"/cli/overview"},{"title":"vibe init","href":"/cli/init"},{"title":"vibe validate","href":"/cli/validate"},{"title":"vibe package","href":"/cli/package"},{"title":"vibe sign","href":"/cli/sign"},{"title":"vibe verify","href":"/cli/verify"},{"title":"vibe keygen","href":"/cli/keygen"},{"title":"vibe inspect","href":"/cli/inspect"},{"title":"vibe revert","href":"/cli/revert"},{"title":"vibe import-compose","href":"/cli/import-compose"},{"title":"vibe install-hooks","href":"/cli/install-hooks"}]},{"group":"Security","pages":[{"title":"Security Overview","href":"/security/overview"},{"title":"Trust Model","href":"/security/trust-model"},{"title":"Package Encryption","href":"/security/package-encryption"},{"title":"Capability Prompts","href":"/security/capability-prompts"},{"title":"Runtime Hardening","href":"/security/runtime-hardening"},{"title":"Secrets","href":"/security/secrets"}]},{"group":"Internals","pages":[{"title":"macOS Host App","href":"/internals/host-app"},{"title":"VM Runtime","href":"/internals/vm-runtime"},{"title":"RPC API","href":"/internals/rpc-api"},{"title":"Snapshot Protocol","href":"/internals/snapshots"},{"title":"State Layout","href":"/internals/state-layout"},{"title":"Compose Compatibility","href":"/internals/compose-compat"}]}]},"basePath":"","title":"Package an App - Vibe","buildId":"dpl_5joLUXmnJgwqjrHAS4dxZrQTdxgh","deploymentId":"dpl_5joLUXmnJgwqjrHAS4dxZrQTdxgh","dynamics":[],"chunks":[]}