Build and package
Packaging turns a working Fission app into something another person, device, store, host, or deployment system can consume. It is separate from distribution: packaging creates the artifact, distribution uploads or submits it.
Use this overview to choose the correct target page, then follow that page for the exact package shape.
Build, package, release, and publish are different steps
Fission keeps the release pipeline explicit. That makes local developer releases
and CI releases easier to reason about because each step has a concrete input
and output.
| | | |
|---|
| | Shared app source, generated target files, native modules | Target build output for local validation. |
| | Build output, icons, signing references, package config | Installable/uploadable artifact plus artifact-manifest.json. |
| fission release-content and fission release-config | Release notes, screenshots, store metadata, review/privacy files | Validated provider-facing release files. |
| fission publish or fission distribute | Artifact manifest, provider config, credentials, release content | Provider upload/submission plus receipt. |
Do not publish raw build output. Publish the artifact manifest produced by the
package step. It records exactly which files, hashes, versions, package ids,
checks, and secondary artifacts are being handed to a provider.
The package loop
A reliable package flow has four steps:
| | |
|---|
| fission readiness package ... | Finds missing SDKs, generated targets, signing references, icons, package ids, and provider tools early. |
| | Builds the target artifact and writes an artifact-manifest.json. |
| Target-specific run, install, serve, or open | Proves the packaged output behaves like the product users will receive. |
| fission release-content ... and fission distribute ... | Uses the manifest instead of guessing which file should be uploaded. |
Do not skip readiness when preparing a release. It is cheaper to discover a missing Android NDK, Xcode tool, icon, or signing reference before the package command starts.
Pick the target page
| | |
|---|
| | |
| | |
| | |
| | |
| | |
| | static web artifact directory or archive |
Terminal app or command tool | | release binary and manifest |
Documentation, marketing, reference, blog | | static artifact or Docker image |
Ecommerce, portal, dashboard, dynamic web process | | |
If a page is mostly read-only and should be crawlable, use the static site target. If it needs request-time data, sessions, signed actions, cache revalidation, workers, or islands, use the server site target. If it is a full interactive browser app, use the web target.
Native products belong in native modules
If the package needs platform-owned code such as a macOS extension, Windows
driver package, Linux helper binary, Android Gradle dependency, or iOS Swift
package, declare it with [[native.modules]] in
fission.toml. Fission then builds, tests,
stages, signs, and manifests the native outputs as part of the normal command
lifecycle. Start with Native modules before
adding ad-hoc scripts. For macOS extensions specifically, also read
macOS native XcodeGen, which
explains the platforms/macos/native/project.yml file Fission-generated
projects use for Xcode target graphs. Use package scripts only at the installer
boundary, for example when linux/run or windows/exe must install services,
drivers, privileged helpers, repair/uninstall logic, or other
operating-system-owned integration. Artifact manifests are the handoff point
Every package format should produce an artifact-manifest.json. That manifest records project identity, target, format, profile, paths, hashes, sizes, MIME types, validation checks, and related files.
Release commands should consume the manifest. That keeps publishing safe to retry because the command can tell exactly what was built and what it is about to upload.
Application resources
Put runtime files that must travel with a desktop or terminal application under
the project's assets/ directory. Fission preserves the complete directory
tree for both fission run and fission package; projects without assets/
remain valid.
Desktop applications resolve the staged tree from the application resource
root:
| |
|---|
| Contents/Resources/assets/ inside the .app |
| assets/ beside the packaged application directories |
| assets/ beside the executable |
Custom Windows packaging scripts receive the source directory in
FISSION_WINDOWS_ASSETS_DIR and are responsible for preserving that tree in
their installer. Fission rejects an assets path that exists but is not a
directory. On macOS, resources are staged before the application bundle is
signed.
Use the manifest path directly:
fission publish \
--project-dir . \
--provider play-store \
--artifact target/fission/release/android/aab/artifact-manifest.json \
--track internal \
--yes
If a publish flow does not receive --artifact, it packages the provider's
default target/format first. That is useful for local guided publishing. CI
should usually pass the manifest explicitly so the build and publish jobs share
one immutable handoff file.
Store targets are sensitive to version/build values. Google Play rejects reused
Android versionCode values. App Store Connect and Microsoft Store also have
provider-side version and package-state rules. Use release-config commands to
make those values explicit before packaging:
fission release-config add-release --project-dir . --version 1.2.3 --build 42 --yes
fission release-config bump-build --project-dir . --target android --yes
fission release-config version-state --project-dir . --provider play-store --target android --track internal --json
Package commands sync the resolved version/build into target-native config where
Fission owns that generated configuration. If provider state says a build number
has already been used, fix the release config and rebuild instead of uploading a
known-bad artifact.
Signing boundaries
Signing is platform-owned. Fission orchestrates checks, configuration, command flow, and receipts, but platform signing should use the tools provided by the platform owner.
Do not commit signing passwords, private keys, tokens, or certificates into fission.toml. Use CI secrets, environment variables, authenticated platform tooling, or operating-system key stores. Next steps
Packaging does not end at producing a binary. App stores and distribution providers need release metadata, screenshots, icons, version fields, signing references, and provider-specific identifiers. Use Build metadata to keep those fields explicit, and use Store screenshots to generate reviewable screenshots from real Fission targets.