Paywalls and components
CLI commands to build, deploy and place paywalls, and to develop custom components.
These commands build and deploy paywalls, choose what each paywall location shows, and develop, publish and install custom components.
Paywalls are in early access. Ask us on Discord, or email support@voidhash.com on a paid plan, to turn them on for your team.
Studio's Paywalls and Paywall locations pages do the same, and the MCP server's paywall tools let agents design and deploy.
Paywalls and locations
| Command | What it does | Key flags |
|---|---|---|
paywall list | Paywalls with the live build and the locations that show it. | --archived |
paywall view [paywall] | The live build, newer builds and where it's shown. | |
paywall create | Creates an empty paywall or onboarding flow. | --name, --slug, --kind paywall|onboarding |
paywall edit [paywall] | Renames a paywall. Its slug can't change. | --name |
paywall build [paywall] | Builds the current design without deploying it. | --wait, --timeout (default 300 seconds) |
paywall deploy [paywall] | Builds and deploys the design everywhere it's shown. Asks first when people see it. | --build <number or id> deploys an existing build, --timeout |
paywall archive [paywall] | Archives a paywall. Locations keep showing its live build. | |
paywall unarchive [paywall] | Restores an archived paywall. | |
paywall delete [paywall] | Deletes a paywall no location shows, with its design and builds. Asks first. | |
location list | Locations with what each shows now, and in test where that differs. | --archived |
location view [location] | What a location shows now, what test keys see, who is pinned, and what it showed before. | |
location create | Creates a location. | --name, --slug, --description, --show <paywall> |
location edit [location] | Renames a location or changes its description. Its slug can't change. | --name, --description, --clear-description |
location show [location] [paywall] | Shows a paywall's live build at a location. Asks first when it replaces what people see. | --env |
location clear [location] | Stops showing anything at a location. Asks first. | --env |
location pin [location] [person] [paywall] | Shows one end user a paywall of their own at a location. | --env, --note |
location unpin [location] [person] | Removes an end user's pin, so they see what everyone else does. | --env |
location rule add [location] [paywall] | Shows another paywall to everyone its conditions hold for. | --when, --name, --first, --env |
location rule remove [location] [position] | Removes one of a location's rules by its number. | --env |
location history [location] | Everything a location has shown, newest first. | |
location archive [location] | Retires a location for good. Asks first. |
A location shows apps that use a test key the same paywall as everyone else until you give it a
test showing of its own. location show <location> <paywall> --env test shows a paywall to those
apps only, so you can try it at a real location before your users see it, and it doesn't ask
first. location clear <location> --env test goes back to what production shows.
voidhash-cli location show onboarding-end annual-upsell --env test
voidhash-cli location show onboarding-end annual-upsell
voidhash-cli location clear onboarding-end --env testPin an end user to a paywall
location pin <location> <person> <paywall> shows one end user a paywall of their own at a
location, whatever it shows everyone else. Name them by email, distinct ID or person ID. Use it
to check a paywall on your own account where it really appears, or to keep one customer on a
paywall.
- A pin answers every app. With
--env testit answers apps using a test key only, and wins there over a production pin. - A pinned end user is outside an A/B test running at the location: not in an arm, and not counted.
- A pin shows only where the location shows something in that environment.
location unpin <location> <person>removes it, andlocation viewlists a location's pins.
voidhash-cli location pin onboarding-end ada@example.com annual-upsell --note "QA"
voidhash-cli location unpin onboarding-end ada@example.comShow another paywall to some people
location rule add <location> <paywall> --when '<condition>' shows a paywall to everyone its
conditions hold for, in place of what the location shows everyone else. Conditions are written as
for flag rule add: platform, app_version, os_version,
country, locale or trait:<key>, compared with in, not in, >=, <, is set or
is not set. Repeat --when; all must hold.
- Rules are read in order, after pins, and the first that matches decides. A new rule goes last;
--firstputs it first. - Someone a rule matches is outside an A/B test running at the location.
- With
--env testa rule answers apps using a test key only, and is read before production's. - A rule shows only where the location shows something.
location viewnumbers a location's rules, andlocation rule remove <location> <position>removes one.
voidhash-cli location rule add onboarding-end annual-upsell --when 'country in DE,AT' --when 'app_version >= 2.4'
voidhash-cli location rule remove onboarding-end 1Custom components
Run dev, new, publish and test in your
app's root. See Develop a component.
| Command | What it does | Key flags |
|---|---|---|
dev | Builds the components in .voidhash/ on every change and serves them to the paywall editor. | --port (default 4319) |
new <name> | Adds a component with its editor panel to .voidhash/components/. | --title |
publish | Publishes new and changed components as new versions. | --all, --component (repeat), --yes |
test [component] | Runs the checks publishing runs on a component, crate or .wasm module. | --panel |
registry list | Project, installed and team registry components. | |
registry publisher show | Your team's component namespace. | |
registry publisher claim <namespace> | Claims the namespace (admins, signed in). | |
registry publish [path] | Publishes a bundle, or a ready project component, to your team's registry. | --from-project <slug>@<version>, --version, --name, --title, --category |
registry install <component> | Installs a registry component, such as acme/wheel-picker. | --range, --yes accepts the review |
registry update <component> | Moves an install to the newest version in its range. | --range, --yes |
registry uninstall <component> | Removes an installed component. | |
registry deprecate <component> [version] | Deprecates a component or one version. | --message, --undo |
registry yank <component> <version> | Yanks a version for good. | --message |
registry transfer <component> | Moves a component to another project of your team (admins, signed in). |
See also Publish a component and Install a component.
Example
voidhash paywall deploy summer-sale --build 3 # roll back to build 3
voidhash new plan-picker --title "Plan picker"Next steps
- Build and deploy: builds, deploys and rollbacks.
- Paywall locations: show a paywall in your app.
- Develop a component: the component dev loop.
Something wrong or missing on this page? Tell us by email or on Discord.