Manifest reference
manifest.json is the whole interface between a pack and the CLI. Point $schema at the published copy and your editor
will check it as you type:
{ "$schema": "https://www.hype-stack.dev/schema/pack-manifest-v1.json" }Identity
| Field | Required | What it does |
|---|---|---|
name | yes | Kebab-case identifier. Match the directory name |
version | yes | Semver. Recorded in the project so a later install can tell versions apart |
displayName | yes | What people see in the picker |
description | yes | One line, shown next to the name |
category | yes | starter, layout, or feature. The catalog supplies this for our own packs, so a community pack has to declare it |
tier | — | Ignored for community packs: nothing here is licensed, so everything installs as free |
dependencies | yes | Packs that must be installed first. [] when the pack stands alone |
peerPacks | — | Packs that make this one better if present, but are not required |
adminCompatible | — | Layouts only: whether the admin shell can render this layout |
Files
files is a list of { source, target, strategy }. source is relative to the pack root, target is a path template.
See Build your own pack for the strategies and slots.
dependencies_npm adds npm packages per app:
"dependencies_npm": { "frontend": { "recharts": "^2.15.0" }, "backend": { "zod": "^4.0.0" } }Wiring
Copying files is rarely enough. These fields tell the CLI to patch a known file in the project so your code is actually reached. Each one is idempotent, so reinstalling never duplicates an entry.
Backend
| Field | Patches | For |
|---|---|---|
routes | routes/index.ts | Registering a Hono route under a prefix |
sockets | sockets/index.ts | A WebSocket handler |
context | context.ts | A value on the backend request context |
env | env.config.ts, .env.example, .env.test | Environment variables the pack needs |
jobs | src/jobs/index.ts | A scheduled background job |
enums | packages/enums/src/index.ts | Shared enums both sides import |
permissions | the shared enums package | New permission subjects and role grants |
Frontend
| Field | Patches | For |
|---|---|---|
frontendRoutes | frontend-url/frontend-url.ts | Typing a route your pack adds |
sdkConfigurations | src/api/sdk.ts | HyperFetch client configuration |
nav | constants/nav.constants.ts | A sidebar entry |
navbarActions | constants/navbar-actions.tsx | An icon in the navbar |
userMenuActions | constants/navbar-actions.tsx | An item in the avatar dropdown |
providers | components/providers/providers.tsx | A React provider mounted at the app root |
settingsTabs | constants/settings-tabs.constants.tsx | A tab on the settings page |
onboardingSteps | setup-organization/steps/index.ts | A step in organization onboarding |
Admin
dashboardRows, orgDetailsRows, and orgDetailsCards inject components into the admin app. They're skipped entirely
in projects with no admin app.
Whole-app
postLoginRedirect sets where the app goes after login. shouldInvertLogo flips logo colours in light mode, for marks
drawn on dark backgrounds.
Copy
User-visible strings belong in a message catalog fragment, not in your JSX:
{
"source": "files/frontend/messages/en.json",
"target": "{{frontend.root}}/messages/en.json",
"strategy": "merge-json",
"slot": "frontend"
}Keys are flat snake_case prefixed with your pack's feature (analytics_page_title). Call them as
m.analytics_page_title(). Chrome the codemods generate (nav entries, settings tabs) takes a messageKey next to
label instead of a hardcoded string, so it translates with everything else.
After the install
postInstall is a list of lines printed once the pack lands. Use it for the things you genuinely cannot do for someone:
an API key to create, a webhook to point somewhere, a decision they have to make.
"postInstall": [
"Set ANALYTICS_WRITE_KEY in .env with a key from your provider dashboard",
"Events are batched every 10s; change it in src/features/analytics/config.ts"
]Fields you can ignore
family, previewNav, preview, previewAdmin, previewMobile, and previewExtension drive the live previews on
the Hype Stack marketplace. They do nothing in a community pack.
Every purchase and sponsorship funds my 8+ years of work on open source given freely to the community. It keeps the lights on, funds new packs, and keeps the ecosystem alive. Even a small tier means a lot. Thank you!
