Programmes from outside
A programme is the words and the light of one self-hypnosis session in the Hypnosis lab: for relaxation, focus and practice, not treatment. It is a small JSON document. Liminal reads one from three doors, none of which needs a network path into the headset:
- A file. A
.liminalfile opened from Files, Mail, Messages, AirDrop or a download. The app claims the extension. - A link. A
liminal://programme?data=...link with the whole programme folded into it, compressed. Tapping it on the headset opens Liminal with the programme. - Pasted text. The programme editor in the lab has Paste a programme, which accepts the JSON, the link, or an answer with the link somewhere in it.
Whatever arrives is shown first: title, what it is for, its length, and whether it ends in sleep. The wearer keeps it or discards it. Nothing runs on its own; a kept programme starts only when the wearer presses Begin in the lab. The consent gate, the light limits and the panic stop are what they always are.
The editor also hands a programme on: Copy link puts the link on the clipboard, Share file offers the .liminal file.
The shape
A file or a link carries an envelope; the bare programme object is accepted too.
{
"liminal": 1,
"programme": {
"title": "A quiet hour",
"blurb": "For setting the day down before sleep.",
"symbol": "moon.stars",
"endsInSleep": false,
"stages": [
{"name": "Settling", "mood": "still", "kind": {"spoken": {}},
"text": "Let yourself sit as you are. [3]\nNotice the weight of your body where it rests. [4]"},
{"name": "Eyes", "mood": "fixation", "kind": {"spoken": {}},
"text": "Rest your eyes on the point of light ahead. [3]\nAnd when they want to close, let them close. [4]\nClosed now. [3]"},
{"name": "Descent", "mood": "settling", "kind": {"descent": {"from": 10, "interval": 3}},
"text": "Picture a lift going gently down, one floor with each number. [3]\nHeavier with every floor. [2]\nThe shoulders let go. [2]"},
{"name": "The floor", "mood": "dark", "kind": {"spoken": {}},
"text": "The doors open onto a quiet place. [5]\nRest here a while. [7]"},
{"name": "Return", "mood": "rising", "kind": {"ascent": {"to": 5, "interval": 3}},
"text": "When I count to five, you come back, rested. [3]\nLighter. [2]\nThe room around you again. [2]"},
{"name": "Awake", "mood": "rising", "kind": {"spoken": {}},
"text": "Eyes open, and back, and glad of it. [3]"}
]
}
}
Fields:
title,blurb: the wearer's words for it. Onlytitleis required.symbol: an SF Symbol name for the list;moon.starsif left out.endsInSleep:truefor a programme meant to be slept through. Its last stage keeps the eyes closed, and when the words end the light goes to nothing and the sphere stays, silent, until the wearer leaves. Such a programme has no return stage.stages: in order. Each hasname,mood,kindandtext.moodsets the light:still(a soft glow),breathing(a slow swell),rising(brightening),settling(dimming),dark(near dark),fixation(a single point to rest open eyes on).kindis{"spoken": {}},{"descent": {"from": N, "interval": S}}counting down from N with S seconds a count and the light sinking, or{"ascent": {"to": N, "interval": S}}counting up with everything rising. In a counted stage the first line is spoken once before the count; the lines after it are spoken between the numbers, in turn, round and round, so write a different phrase for each number.text: the words, one line per sentence. A mark like[3]holds three seconds after the line; a line without one ends with a short breath. Pauses are the programme's pacing, so use them.idandbuiltInare not for outside: an id is given on arrival, and nothing that arrives is built in.
How a link is packed
The data value is one letter and then base64 with the URL-safe alphabet (- and _) and no padding. The letter j means the base64 is the JSON as it is; z means it is the JSON compressed as a raw DEFLATE stream, no zlib header or checksum. The app writes z when that is smaller. Anything that can base64-encode can make a j link.
What a good programme is
The shipped programmes run about fifteen minutes by their content. A programme is not made longer with silence; it is made longer with words. The usual shape is: settling, eyes on the point of light until they close, breathing with the light, a counted descent with a phrase for every number, the floor, the suggestions in plain second-person present tense, carrying it out of the session, and a counted return with the eyes opening at the last stage. A sleeping programme ends at the floor, with a short stage that says the words will end and the dark will stay.
Suggestions are about relaxation, focus, rest and practice, in the wearer's own words where they gave any. Nothing in a programme claims to treat, cure or diagnose.
The page to hand a chatbot
Copy this to any chatbot, with what the wearer wants after it.
Write a self-hypnosis programme for Liminal, an Apple Vision Pro app. A programme is for relaxation, focus or practice, never treatment, and makes no medical claim. Return it as one JSON object in the shape below, inside an envelope
{"liminal": 1, "programme": {...}}, and nothing else. Stages in order, each withname,mood(one of still, breathing, rising, settling, dark, fixation),kind({"spoken": {}}, or{"descent": {"from": N, "interval": 3}}counting down, or{"ascent": {"to": N, "interval": 3}}counting up) andtext: one sentence a line, with a pause mark like[3]at the end of a line to hold three seconds. In a counted stage the first line is spoken once, and every line after it is spoken between the numbers in turn, so give a different phrase for every number. Aim for about fifteen minutes of words: settling, eyes on the point of light until they close (mood fixation), breathing with the light, a descent from twenty or thirty with the light settling, the floor in the dark, suggestions, carrying it out, and a counted return ending with the eyes open. If the programme is for sleep, set"endsInSleep": true, leave out the return, and end with a short stage saying the words will end and the dark will stay. Settitleand a one-lineblurb.
The answer is saved as a .liminal file, or pasted into the editor with Paste a programme, or sent to the headset any way a file travels. A chatbot that can make links can also return the JSON to a local agent, which turns it into a liminal:// link with liminal_programme.