Packs & Studios
The packs that extend Orazaka without code: the reference catalogue, each manifest field, and how to write, validate and install a pack.
🤖 Generated from code by
scripts/generate-docs.mjs— do not hand-edit. Runorazaka docs buildto refresh.
A Studio is a business workflow — a versioned DAG of steps (model calls, transforms, human approvals,
connectors) with its own input form. A pack is a directory that ships Studios: a pack.yaml manifest,
its translations, the blueprints and, for a WORKER pack, its own worker. Installing a pack writes data —
capability rows, a price, catalogue entries — and changes no code.
Packs are not use-cases. A pack is a business offer — Studios a customer installs and runs. A use-case is a technical entry point of the engine (
chat.assistant,studio.run…) declared in Java inorazaka-business(business layer); every Studio run goes through thestudio.runone.
The packs
10 of 10 packs
- Real-Estate StudioYour listings become Reels ready to publish.DATA · 1 Studio · Creativity & media
- Media StudiosGenerate, listen, describe — without leaving a run.DATA · 16 Studios · Creativity & media
- Outbound ProspectingFrom a prospect list to a sequence that ships.DATA · 3 Studios · Business & documents
- Recommendations & insightsA feed per person and analytics per creator, on your own data.DATA · 3 Studios · Data & analytics
- WellbeingPut into words what you live through, and bring it to your sessions.DATA · 4 Studios · Wellbeing
- Document VerificationCheck a contract against the rules, and a PDF for signs of tampering.WORKER · 2 Studios · Business & documents
- Media safetyIs this photo, video or voice message safe to show?WORKER · 1 Studio
- Message authenticityDoes this message read like a person wrote it? A signal, never a verdict.WORKER · 1 Studio
- Profile photo checkAre these photos one real adult's profile?WORKER · 1 Studio
- Trade ShowcaseDATA · 1 Studio
Real-Estate Studio
Your listings become Reels ready to publish.
The real-estate agent's pack: the Real-Estate Reels Studio and the credits to run it.
- realestate-studio 1.3.0
- Tier DATA
- OSS
- Regulatory class STANDARD
Real-Estate Reels
realestate-reels
Five photos become a Reel ready to publish.
MoreLess
Property photos, a three-line brief, and you leave with a 9:16 Reel, its caption and its hashtags.
Asks for
- Photos du bien
- Clip vidéo (optionnel)
- Le bien en 3 lignes
- Plateforme
- Steps
- 4 capability, approval
- Credits held
- 2800
Media Studios
Generate, listen, describe — without leaving a run.
- orazaka-media 1.13.0
- Tier DATA
- TOOLKIT
- OSS
- Regulatory class STANDARD
Image generation
image-generation
One sentence, one image.
Asks for
- Ce que vous voulez voir
- Format
- À éviter (facultatif)
- Graine (facultatif)
- Modèle
- Steps
- 1 capability
- Credits held
- 200
Golden-hour editorial
art-golden-hour
Your subject, in warm low light, shot like a magazine spread.
MoreLess
Lifestyle photography at golden hour: raking sunlight, an 85 mm lens wide open, weathered wood, wool and brass, an amber and terracotta palette. Describe who and where — the light, the optics, the materials and the palette are taken care of.
Asks for
- Votre sujet
- Format
- Graine (facultatif)
- Steps
- 1 capability
- Credits held
- 200
Tilt-shift miniature
art-miniature
Your scene as a handcrafted diorama, shot in macro.
MoreLess
A 1:24 diorama of figurines and props in felt, embroidered thread and painted resin, a razor-thin plane of focus and soft window light. Describe the scene; it becomes a miniature.
Asks for
- Votre sujet
- Format
- Graine (facultatif)
- Steps
- 1 capability
- Credits held
- 200
Artisanal still life
art-still-life
Objects and produce in single-window light.
MoreLess
Chiaroscuro on a weathered table: hand-thrown ceramics, hammered copper, linen and fresh produce, a muted earthy palette. Name the objects; they are arranged and lit.
Asks for
- Votre sujet
- Format
- Graine (facultatif)
- Steps
- 1 capability
- Credits held
- 200
Montreal neon night
art-montreal-night
Wet streets, brick and spiral staircases under magenta and teal.
MoreLess
Montreal after rain: cobblestones mirroring window light and neon, light mist, a 35 mm lens wide open, cinematic grading. Describe the place and the moment.
Asks for
- Votre sujet
- Format
- Graine (facultatif)
- Steps
- 1 capability
- Credits held
- 200
Video generation
video-generation
A vertical short (9:16) or a wide shot, described then rendered.
Asks for
- Ce qui doit se passer à l'écran
- Durée (secondes)
- Format
- Image d'amorce (facultatif)
- Modèle
- Graine
- Netteté
- Steps
- 1 capability
- Credits held
- 3600
Cinematic short — treatment
cinematic-treatment
A short brief becomes a story: an arc, intentions, living shots, directed lines, music, sound.
Asks for
- Le brief
- Format d'image
- Durée (secondes)
- Notes de la critique
- Langue des textes
- Modèle de langage
- Steps
- 1 capability
- Credits held
- 30
Cinematic short — critique
cinematic-critique
A director's read of a treatment: scores, flat or off-topic shots rejected, what to change.
Asks for
- Le traitement à juger
- Modèle de langage
- Steps
- 1 capability
- Credits held
- 10
Cinematic short — script
cinematic-script
A brief becomes a shot list: 8–12 shots, original characters, music, voice-over.
Asks for
- Le brief
- Le format
- Format d'image
- Durée (secondes)
- Nombre de plans
- Langue des textes
- Modèle de langage
- Steps
- 1 capability
- Credits held
- 40
Cinematic short — cut
cinematic-cut
Your shots edited into one film: cuts, ramps, grade, titles, the AI label.
Asks for
- Les plans
- La liste de décisions de montage (JSON)
- Steps
- 1 capability
- Credits held
- 900
Video with sound
video-with-sound
A video, then its sound: a music bed and optional foley, mixed at -14 LUFS.
Asks for
- Ce qui doit se passer à l'écran
- Durée (secondes)
- Format
- Image d'amorce (facultatif)
- Modèle
- Graine (facultatif)
- La musique
- Les bruitages (facultatif)
- Modèle de bruitage (facultatif)
- Steps
- 2 capability
- Credits held
- 4500
Sound for a video
video-sound
Give any clip sound: music, foley, a voice-over. The silent original is kept.
Asks for
- La vidéo
- La musique
- Les bruitages (facultatif)
- Modèle de bruitage (facultatif)
- Graine (facultatif)
- Voix off (facultatif)
- Steps
- 1 capability
- Credits held
- 900
Speech synthesis
speech-synthesis
Your text, read aloud.
Asks for
- Le texte à lire
- Voix
- Steps
- 1 capability
- Credits held
- 40
Image analysis
image-analysis
What an image shows, in words.
Asks for
- Votre image
- Ce que vous voulez savoir
- Modèle
- Steps
- 1 capability
- Credits held
- 30
Audio transcription
audio-analysis
What was said, written down.
Asks for
- Votre fichier audio
- Modèle
- Steps
- 1 capability
- Credits held
- 60
Video analysis
video-analysis
A video's speech, and its keyframes.
Asks for
- Votre vidéo
- Modèle
- Steps
- 1 capability
- Credits held
- 90
Outbound Prospecting
From a prospect list to a sequence that ships.
The salesperson's pack: qualify a list, write each prospect's angle, and get the follow-ups out — three Studios over the same list.
- outbound-prospection 1.3.0
- Tier DATA
- OSS
- Regulatory class STANDARD
Outbound Prospecting
outbound-prospection
Your prospect list becomes a sequence ready to send.
MoreLess
Describe your target and your offer: Orazaka writes a per-prospect angle, then a sequence ready to leave for your channel.
Asks for
- Vos prospects
- Votre offre en une phrase
- Votre client idéal
- Steps
- 4 capability, transform, approval, connector
- Credits held
- 250
Lead Research
lead-research
Your raw list becomes a prioritised dossier.
MoreLess
One brief per prospect — sector, buying trigger, expected objection — then a ranking so you know who to call first.
Asks for
- Vos prospects
- Votre offre en une phrase
- Votre client idéal
- Steps
- 3 capability, transform
- Credits held
- 380
Follow-up Sequences
followup-sequences
Your first contacts become follow-ups that go out.
MoreLess
A multi-touch follow-up per prospect, unified into one voice, approved by you, then posted to your channel.
Asks for
- Prospects à relancer
- Votre offre en une phrase
- Ce qui s'est passé au premier contact
- Steps
- 5 capability, transform, approval, connector
- Credits held
- 510
Recommendations & insights
A feed per person and analytics per creator, on your own data.
The recommender your product calls with a service key: send pseudonymous events and your eligible items, read a "for you" feed, similar items and creator insights — every item says why it is there. Two Studios read your videos and suggest titles and tags.
- data-analytics 1.6.0
- Tier DATA
- OSS
- Regulatory class STANDARD
Data-driven UI
data-driven-ui
A CSV and a question become a live dashboard.
MoreLess
Give your data (a CSV, a JSON export of your analytics) and ask: the answer comes as figures, charts and a table you can read at a glance. Every number comes from your data.
Asks for
- Vos données (facultatif)
- Votre question
- Langue
- Modèle de langage
- Steps
- 1 capability
- Credits held
- 30
Video understanding
video-understanding
What a video is about — topics, tags and safety signals, from a keyframe.
MoreLess
A keyframe goes through the vision model, then a reading in JSON: a summary, topics, tags, the language and safety labels. The labels go to a human moderator, never to an automatic takedown.
Asks for
- L'image clé
- Le titre de la vidéo
- La description (facultative)
- Langue de la lecture
- Steps
- 2 capability
- Credits held
- 40
Creator suggestions
creator-suggestions
Three titles, a description and tags — proposals the creator approves.
MoreLess
From the creator's own words and the tags that perform with their audience. Nothing is invented, nothing is published without the creator.
Asks for
- Votre titre
- Votre description (facultative)
- Vos mots-clés (facultatif)
- Ce qui marche auprès de votre audience (facultatif)
- Langue
- Steps
- 1 capability
- Credits held
- 15
Wellbeing
Put into words what you live through, and bring it to your sessions.
Guided journaling, session preparation and mood tracking. Not care: no diagnosis, no advice on treatment, no emergency service — what you bring to a professional, not instead of one. Health data, kept 30 days at most, never used to train a model.
- bien-etre 1.5.0
- Tier DATA
- CLOUD
- Regulatory class REGULATED
A scope guard refuses anything outside this pack's domain.
Versioned consent is asked before install.
A fixed, reviewed crisis response is built in.
Guided Journaling
guided-journaling
Your words, put in order — in your own voice.
MoreLess
Write what you want to set down, as it comes: the Studio tidies it into a clean entry, in the first person, without adding advice or interpretation.
Asks for
- Ce que vous voulez mettre par écrit
- Steps
- 1 capability
- Credits held
- 40
Session Preparation
session-preparation
Your notes since the last session become the points to raise.
MoreLess
Paste what you noted, in any order: the Studio turns it into the list of points to bring to your next session, without interpreting anything.
Asks for
- Ce que vous avez noté depuis la dernière séance
- Steps
- 1 capability
- Credits held
- 40
Mood Tracking
mood-tracking
What your daily notes show, described — never concluded.
MoreLess
One line a day is enough: the Studio describes what the entries show over time, and draws no conclusion from them.
Asks for
- Vos relevés
- Steps
- 1 capability
- Credits held
- 40
Session Summary
session-summary
What you keep of a conversation — themes, what helped, one small step.
MoreLess
Hand over the turns of a conversation: the Studio returns what you keep of it — up to three themes, what helped, one small step, and what to bring to your therapist — described in your words, never explained.
Asks for
- Le moment
- Le fil
- Humeur avant (auto-déclarée)
- Humeur après (auto-déclarée)
- Langue du résumé
- Steps
- 1 capability
- Credits held
- 40
Document Verification
Check a contract against the rules, and a PDF for signs of tampering.
Check a document against a versioned body of rules — every finding cites its rule, its source and the passage that justifies it — and examine a PDF file for the signals that something was altered. Reports, never legal advice.
- document-validation 1.7.2
- Tier WORKER
- CLOUD
- Regulatory class SENSITIVE
- Own worker orazaka-worker-validation
A scope guard refuses anything outside this pack's domain.
Rulesets
- Bail de résidence principale — Région wallonneBE-WAL · 4 rules2025-01-01
- Bail d'habitation — FranceFR · 10 rules2024-07-01 · 2026-07-01
- Facture — Québec (TPS et TVQ)QC · 8 rules2024-06-20
- Bail de logement — QuébecQC · 10 rules2024-02-21
- Contrat de service — Québec (première étape)QC · 4 rules2026-10-19
Document Authenticity
document-authenticity
A PDF's metadata, structure and fonts, examined for signs of tampering.
MoreLess
Examines the file itself — who produced it, when, with what, and whether it was edited afterwards — and lists the points worth clearing up. It never judges what the document says.
Asks for
- Le fichier PDF
- Émetteur attendu (facultatif)
- Steps
- 1 capability
- Credits held
- 30
Compliance Check
compliance-check
Your lease or contract, checked against the rules of its jurisdiction.
MoreLess
Runs a lease or a contract against the rules of its jurisdiction, as they stood on a date you pick. Each finding gives its rule, its source and the passage of the document.
Asks for
- Document à contrôler
- Juridiction
- Règles en vigueur à la date du
- Corpus nommé
- Steps
- 3 capability
- Credits held
- 120
Media safety
Is this photo, video or voice message safe to show?
Judges pictures (a photo, or frames of a video) and a voice message's transcript against a short, public set of lines: no nudity or sexual content, no graphic violence, no threats or harassment. An answer nobody could read is never a pass.
- media-safety 1.2.0
- Tier WORKER
- CLOUD
- Regulatory class SENSITIVE
- Own worker orazaka-worker-safety
A scope guard refuses anything outside this pack's domain.
Media safety
media-safety
A safety check that fails closed.
MoreLess
A vision question per picture, a transcript and a text judgement for sound, then closed rules. Unreadable means held, never approved.
Asks for
- Les images à examiner
- Le nombre d'images
- Le son à juger (facultatif)
- Il y a du son à juger
- Steps
- 4 capability
- Credits held
- 30
Message authenticity
Does this message read like a person wrote it? A signal, never a verdict.
Reads one message with a small open classifier and answers a coarse level — never a score. It can be wrong, above all on short texts and on non-native or French writing. It never writes a message for anyone.
- message-authenticity 1.3.0
- Tier WORKER
- CLOUD
- Regulatory class SENSITIVE
- Own worker orazaka-worker-authenticity
A scope guard refuses anything outside this pack's domain.
Message authenticity
message-authenticity
A coarse signal on a text, never a verdict.
MoreLess
One step, no generative model. The text is read and forgotten; the answer is low, mid, high or unavailable.
Asks for
- Le message
- Langue du compte (facultatif)
- Steps
- 1 capability
- Credits held
- 5
Profile photo check
Are these photos one real adult's profile?
Checks a set of profile photos: enough of them, enough with a face, the same person from one face photo to the next, nothing written over the picture, no screenshots. It answers in codes, identifies no one and recognises no celebrity.
- profile-photo-check 1.2.0
- Tier WORKER
- CLOUD
- Regulatory class SENSITIVE
- Own worker orazaka-worker-photo
A scope guard refuses anything outside this pack's domain.
Profile photo check
profile-photo-check
Faces present, the same person throughout, nothing written on the photo.
MoreLess
Finds the faces in each photo, asks a vision model three yes/no questions about it, and gives a verdict made of codes. The face vectors live for one job and are never kept; a model answer that cannot be read blocks nothing.
Asks for
- Les photos (fichiers envoyés)
- Les mêmes photos, en base64
- Comparer les visages entre eux
- Photos au moins
- Photos au plus
- Photos de visage au moins
- Steps
- 3 capability
- Credits held
- 40
Trade Showcase
- trade-showcase 1.2.0
- Tier DATA
- OSS
- Regulatory class STANDARD
Trade Showcase
trade-showcase
Your job sites become a showcase that sells.
MoreLess
Drop in photos of your work: Orazaka describes them, then composes a branded showcase visual.
Asks for
- Photos de vos réalisations
- Votre métier
- Steps
- 3 capability
- Credits held
- 210
Kept off the shelf (catalog.status: DRAFT): echo-toolkit — installable for the platform's tests, never sold.
The reference packs (orazaka-packs)
| Pack | Version | Tier | Distribution | Regulatory class | Catalogue entry | Studios | Own capabilities |
|---|---|---|---|---|---|---|---|
data-analytics | 1.6.0 | DATA | OSS | STANDARD | yes | data-driven-ui, video-understanding, creator-suggestions | — |
document-validation | 1.7.2 | WORKER | CLOUD | SENSITIVE | yes | document-authenticity, compliance-check | orazaka.validation.document.screen, orazaka.validation.document.signals, orazaka.validation.document.assemble (worker orazaka-worker-validation) |
echo-toolkit | 1.2.0 | WORKER | OSS | STANDARD | yes | echo-reverse | orazaka.echo.text.reverse (worker orazaka-worker-echo) |
media-safety | 1.2.0 | WORKER | CLOUD | SENSITIVE | no | media-safety | orazaka.safety.media.assess (worker orazaka-worker-safety) |
message-authenticity | 1.3.0 | WORKER | CLOUD | SENSITIVE | no | message-authenticity | orazaka.message.authenticity.read (worker orazaka-worker-authenticity) |
orazaka-media | 1.13.0 | DATA | OSS | STANDARD | yes | image-generation, art-golden-hour, art-miniature, art-still-life, art-montreal-night, video-generation, cinematic-treatment, cinematic-critique, cinematic-script, cinematic-cut, video-with-sound, video-sound, speech-synthesis, image-analysis, audio-analysis, video-analysis | — |
outbound-prospection | 1.3.0 | DATA | OSS | STANDARD | yes | outbound-prospection, lead-research, followup-sequences | — |
profile-photo-check | 1.2.0 | WORKER | CLOUD | SENSITIVE | no | profile-photo-check | orazaka.photo.profile.inspect, orazaka.photo.profile.assess (worker orazaka-worker-photo) |
realestate-studio | 1.3.0 | DATA | OSS | STANDARD | yes | realestate-reels | — |
trade-showcase | 1.2.0 | DATA | OSS | STANDARD | no | trade-showcase | — |
bien-etre | 1.5.0 | DATA | CLOUD | REGULATED | yes | guided-journaling, session-preparation, mood-tracking, session-summary | — |
From the terminal
| Command | What it does |
|---|---|
orazaka pack validate <directory> | Check a bundle's manifest, and whether this platform can run it |
orazaka pack install <directory> | Install a bundle: capabilities, billing and catalogue, or none of them |
orazaka pack publish <directory> | Put an installed bundle's pack and Studios on the shelf |
orazaka pack list [directory] | List the bundles this deployment's pack sources offer |
orazaka studio list | Browse the Studio catalogue |
orazaka studio installed | List the Studios you have installed |
orazaka studio install <studioKey> | Install a Studio into your workspace |
orazaka studio run <target> | Run an installed Studio — or, with --studio, a toolkit Studio by its key |
orazaka studio logs <runId> | Show a run's per-step state and results |
Manifest fields
From pack.schema.json — the schema orazaka pack validate checks against.
| Field | Required | Values | Meaning |
|---|---|---|---|
apiVersion | yes | — | Manifest grammar version. |
key | yes | — | The bundle's stable identity. |
version | yes | — | — |
tier | — | DATA · CAPABILITY · WORKER | What the pack needs from the platform. |
distribution | — | OSS · CLOUD · PARTNER | Where the pack may be obtained. |
regulatoryClass | — | STANDARD · SENSITIVE · REGULATED | Drives the seven controls of phase I. |
kind | — | VERTICAL · TOOLKIT | How the pack reaches the user (ADR-061). |
requires | — | — | What must already be true of the platform for this pack to run. |
catalog | — | — | The shelf entry: a pack row, its category and its bundling of Studios. |
pricing | — | — | What the pack costs and what buying it grants — the billing_pack half. |
studios | yes | — | The Studios this bundle ships. |
scopeGuard | — | — | The domain this pack REFUSES to answer in. |
consent | — | — | The versioned consent a REGULATED pack requires before it may be installed. |
safety | — | — | A REGULATED pack's crisis handling. |
Writing a pack
A pack is a directory. It does not live in this repository, it is not compiled, and installing one changes no code. If you can write YAML and JSON, you can ship a Studio.
This guide was written by installing a pack from outside the repository and writing down every place it went wrong. Each ⚠ below is a mistake that actually happened, in the order it happened.
1. The shape
my-pack/
pack.yaml # the manifest — the only required file
i18n/
en.yaml # one file per locale, discovered by convention
fr.yaml
studios/
my-studio/
blueprint.json # the workflow
worker/ # Tier-W only: your worker process
worker.yaml
…Nothing here names a path inside Orazaka. Put the directory anywhere you like — ~/packs/my-pack
is fine.
2. The manifest
apiVersion: orazaka.dev/v1
key: my-pack # kebab-case, globally unique
version: 1.0.0 # semver
tier: DATA # DATA | CAPABILITY | WORKER
distribution: OSS # OSS | CLOUD | PARTNER
regulatoryClass: STANDARD # STANDARD | SENSITIVE | REGULATED
requires:
capabilities: [] # empty for DATA: you reuse orazaka.core.*
catalog:
categoryKey: business-compliance # business-compliance | creativity-media | wellbeing | data-analytics (closed list)
iconKey: sparkles
pricing:
priceCents: 0
includedCredits: 0
studios:
- key: my-studio
profession: general
iconKey: studio
pricing: FREE # FREE | INCLUDED | PAID
entitlementKey: studio.my-studio # by convention studio.<key>
blueprint: studios/my-studio/blueprint.json⚠
tierisDATA, notD. The tiers are spelled out:DATA,CAPABILITY,WORKER.⚠
regulatoryClasshas noNONE. The floor isSTANDARD.⚠
blueprintis a path, not an inline object. The manifest names files; it does not embed them.⚠ There is no
i18n:key. Thei18n/directory is found by convention. The manifest rejects unknown properties outright, so an invented key fails validation rather than being ignored.⚠
pricingispriceCents+includedCredits. NotbundledCredits.priceCentsis in cents of the billing service's currency (billing.currency— Canadian dollars for Orazaka:7900is 79 $ CA); a manifest never names a currency.
Everything else is optional and has a default. orazaka pack validate names the exact line when
something is wrong, so run it before you run anything else.
2.1 Declaring SENSITIVE
Raise regulatoryClass above STANDARD and the engine applies four controls to every run of your
pack. You do not implement them and you cannot opt out of them; you declare one thing, and the
platform owes you the rest.
regulatoryClass: SENSITIVE
scopeGuard: # REQUIRED once regulatoryClass is not STANDARD
refusedTerms: # the domain your pack does NOT serve
- conseil juridique
- avocat
refusal: >- # what a refused turn is told, verbatim
Je rédige et relis des documents. Je ne donne pas de conseil juridique —
pour cela, adressez-vous à un professionnel du droit.What you get:
| Control | What the engine does | What you declare |
|---|---|---|
| Data class | every run, input and artefact is stamped SENSITIVE; it is excluded from analytics and never used for training | nothing |
| Shortened retention | runs are purged after 30 days instead of the platform's 180 | nothing; an installation may set retentionDays in its config to go lower, never higher |
| Audit log | RUN_STARTED and a terminal row per run, append-only, UPDATE and DELETE refused by the database | nothing |
| Scope guard | a turn naming a refused term is stopped before any inference, and answered with your sentence | scopeGuard |
The publish gate is code, not a checklist: a pack that declares a regulatory class above STANDARD
without a scopeGuard fails to install, naming the missing key. A second condition is not yours
to satisfy: your pack is also refused by a platform that stores assets in the clear. That is the
platform operator's declaration, not yours, and the error names the key they must set. On a local
developer machine it is already satisfied. A pack that refuses nothing has
not stated a domain, and a legal-drafting Studio with no scope guard is one that answers legal
questions.
refusedTerms is matched on whole words, accent- and case-insensitively, against the turn as the
user wrote it. Name the domain you decline, not every phrasing of it — the list is a declaration,
not a filter, and the engine never adds terms of its own.
3. The blueprint
{
"version": "1.0.0",
"status": "PUBLISHED",
"estimatedCredits": 40,
"createdBy": "you",
"definition": {
"studioKey": "my-studio",
"version": "1.0.0",
"steps": [
{ "id": "brief", "kind": "CAPABILITY",
"featureKey": "orazaka.core.chat.completion",
"dependsOn": [],
"inputs": { "prompt": "Write about {{inputs.subject}}." },
"out": "brief", "onError": "FAIL", "maxAttempts": 1, "timeout": "PT2M" }
],
"outputs": [
{ "key": "brief", "label": "Your brief", "from": "{{steps.brief.content}}", "type": "TEXT" }
]
},
"inputSchema": { "type": "object", "required": ["subject"],
"properties": { "subject": { "type": "string", "title": "Subject" } } },
"configSchema": { "type": "object", "properties": {} }
}⚠ An output needs
labelandtype, not justkeyandfrom. A missing label is a400on the first run, not at install.
Step kinds: CAPABILITY (runs a model), TRANSFORM (reshapes values), APPROVAL (parks for a
human), CONNECTOR (calls out), KNOWLEDGE. onError: FAIL | SKIP | RETRY — and a
SKIP needs a written skipRationale, which a fitness function checks.
Templates. {{inputs.x}}, {{config.x}}, {{steps.<out>}}, {{item}} inside a forEach. A
template that is exactly one placeholder over a list stays a list; anywhere else it renders as
text. That is what lets a step take a list of asset ids.
Closed sets are chosen, never typed. A field whose values are a known set is a list in every client
(web, phone), so a person cannot type a value that does not exist (tests/closed-sets.test.mjs refuses it):
| You write | The client draws |
|---|---|
"enum": ["9:16", "16:9"] | a select (readable names come from the client's messages) |
"oneOf": [{ "const": "9:16", "title": "Vertical" }, …] | a select with your labels |
"x-options": { "source": "models", "category": "image" } | a searchable picker fed by the model catalogue (orazaka_models): label, local or cloud, speed, typical time, price, availability and the default that will run. Never list the models yourself — a hand-kept enum drifts from the catalogue. |
"x-control": "seed" | a number with a « random » switch (nothing is sent while it is on) |
"x-advanced": true | folded under « More options » — model, seed and things to avoid are advanced; the field the Studio is about is not |
Every select speaks both languages (x-i18n). A field that is a list carries its words in English and French, so a
client never shows the blueprint's French on an English page: "x-i18n": {"en": {"title", "description", "options"}, "fr": {…}}, where options maps each enum value to its label — or, on a catalogue-fed model field, each model id to
{ "label": "LTX-Video · fast", "hint": "one line" }. The helper is one line (≤ 140 characters), a hint ≤ 100; the
long comparison of the models is never written there: the client draws it from the catalogue's facts (time, price, where it
runs) and from x-options.facts ({ "<model id>": ["1216×704", "5 s"] }, language-neutral). The category of x-options is
the catalogue's, lowercase (chat, not CHAT: a category that matches no model draws an empty select).
tests/closed-sets.test.mjs refuses a select without its words, a long helper, or an uppercase category.
Every field speaks both languages, not only the selects. A free-text, numeric, boolean or file field carries
x-i18n.en and x-i18n.fr too: a title, a one-line description (≤ 140 characters) and, for a free-text field,
the placeholder it shows (an example of what to type). The blueprint's own title / description stay for clients
that predate it. The same test refuses a field without them, an English word that is French, and the dev data check
(node scripts/audit-studio-forms.mjs in krizaka/orazaka) reads the published blueprints for the same.
The Studio service writes the catalogue's list into the schema it serves (oneOf of const/title, the facts in
x-meta) and refuses, before any credit is held, a value that is not in it.
estimatedCredits is a hold, not a price. Size it for your blueprint's worst legal input —
the maximum forEach fan-out, every optional step firing. It is released, not charged: a run
settles what it measured.
4. Install it
orazaka pack validate ~/packs/my-pack # shape, then the platform's own checks
orazaka pack install ~/packs/my-packvalidate checks your manifest against the platform's schema — the one the CLI carries, not
one you ship — and then asks the running platform whether every featureKey you name resolves.
⚠ A published version is immutable. Re-installing
1.0.0after editing the blueprint does nothing and reports success. Bump the version. Editing means minting a version (ADR-034 §4).
5. Make it runnable
Installing puts a Studio in the catalogue; it does not entitle anyone to it. Your pack's
entitlementKey is granted to whoever holds the pack:
curl -X POST localhost:8088/api/v1/billing/pack-subscriptions/me/my-pack \
-H "Authorization: Bearer $TOKEN"⚠ The entitlement cache is 60 seconds. A pack subscription does not evict it today, so a Studio you just bought can stay
REQUIRES_PLANfor up to a minute. Wait, do not re-install.
Plans are the platform's commercial offer, so bundling your Studio into free/premium is a
deployment decision, not something a pack can do to itself.
6. Tier-W: bringing your own worker
Declare it in the manifest —
requires:
capabilities:
- key: orazaka.echo.text.reverse # your namespace, your key
label: Reverse text
routingKey: job.echo.reverse # job.<family>.<action>
handlerKey: echo.reverse
billableCapability: CHAT
billableUnit: KILOTOKEN
workers:
- name: orazaka-worker-echo
bindings: ["job.echo.*"]— and write a process that honours docs/WORKER_PROTOCOL.md. The
broker is the plugin boundary: your worker links no Orazaka library and implements no interface.
It must
- declare its own topology — exchange, queue, bindings, DLQ — so installing your pack needs no change to the platform's broker configuration;
- decide from the routing key, never from a capability name;
- answer
job.{jobId}.doneorjob.{jobId}.erroronorazaka.events; - report measurements (
tokens,frames,gpuSeconds, …), never units or prices; - be idempotent by
messageId— delivery is at-least-once.
⚠ The success key is
result, notoutput. Getting it wrong gives you aSUCCEEDEDrun with an empty output and no error anywhere.
The worked example is orazaka-packs/echo-toolkit — a manifest, a
Studio and a ~120-line Python worker that reverses a string. It is deliberately trivial: everything
in it that is not about the extension point would hide the extension point.
6.1 Three things that would otherwise cost you an hour
Found by shipping document-validation (ADR-052 §6), and none of them visible from reading the code.
The broker credentials are the RABBITMQ_* family — RABBITMQ_HOST, RABBITMQ_PORT,
RABBITMQ_USER, RABBITMQ_PASS. They used to have two names each depending on how your .env
was generated, and picking the wrong one got you ACCESS_REFUSED (403) with no diagnosis; ADR-053
§8 settled it. The old SPRING_RABBITMQ_* and RABBITMQ_PASSWORD names are still read for one
version, with a warning naming what to rename — so an older .env keeps working and tells you.
Re-installing at the same blueprint version keeps the stored one. A PUBLISHED blueprint
version is immutable by design — shipping a change means shipping a new version. pack install
still says "Installed", and your edit is not what runs. Bump version in the blueprint (and in
definition.version) every time you change it. The installer logs what it kept, so check the
studio service's log if a change seems to have no effect.
{{steps.out}} is for prompts, {{steps.out.field}} is for data. A whole-step reference
interpolates the value's toString — fine inside a prompt, useless to a JSON parser. If your step
must hand structured data to a later step, emit it as an explicit JSON string field and reference
that field.
7. Where packs come from
One property decides, and it is the only difference between an open-source deployment and a hosted one:
ORAZAKA_PACKS_SOURCES=orazaka-packs # OSS: this repo's reference packs
ORAZAKA_PACKS_SOURCES=orazaka-packs,~/packs # plus your own
ORAZAKA_PACKS_SOURCES=~/packs,registry:https://… # plus a hosted registryorazaka pack list shows the configured sources and what they offer. A registry source is listed
and marked unavailable on a local deployment rather than silently ignored.
8. Licence
Your pack is yours. See docs/LICENSING.md.