macOS, Windows and Linux · source-available

Gateway Forge

A guided-meditation assembly system and journal built around the Monroe Institute's Gateway framework — the Institute's own map kept beside what was actually found, never merged into one answer.

49 Focus levels, F1 through F49 3,672 checks passing Local-first. No cloud, ever Bed generated live, never sampled

Why it exists

The interesting part isn't the meditation. It's what happens when two maps disagree.

The Monroe Institute published what its Gateway tapes are supposed to do. Practicing them for years produces a second account — the listener's own — and the two do not always agree. Focus 26 is the clearest case: the Institute places it among the Belief System Territories; what's actually there is a featureless dark. Most tools would pick a winner. This one shows both, permanently, and lets the disagreement stand.

That single decision — published is not found, and neither overwrites the other — runs through the whole app: three-valued coverage (a level is described by a tape, by a second-hand summary, or by nothing at all, and those are different kinds of evidence), a local model that drafts session content but only from what's actually written down, and a binaural bed generated fresh at playback from measurements of the real tapes rather than looped recordings of them.

Nothing here is asserted that could be measured. Where something hasn't been tested, the checks say so by name rather than passing quietly over it.

Measured

A cut-off breath, measured back to a clean one

The bundled voice is a Piper/VITS model fine-tuned on real speech, and its training clips were trimmed tight — so the model learned to stop mid-breath. A short line like "Build the pattern." ended at rms 0.0061 with the mic still open, against roughly 0.0007 for a clean stop. The fix isn't a fade — fading a real recording eats the same consonant it's meant to protect — it's giving the model two extra frames of silence to decay into before the cut.

paddingmean tail rmsworst caseruns above threshold
none0.001800.0060514%
+1 frame0.000750.002460%
+2 frames0.000390.000790%
+3 frames0.001120.003360%

Three frames is worse than two — past a point the model has room to voice into the extra silence rather than settle into it. It's a measured optimum, not a rounder-sounding guess, over seven real lines and five draws each.

The app

Every level is reachable, and the floor is F1

Shots below are a genuinely fresh install — this public checkout's own bundled library, zero visits, zero journal entries. Not staged: the Institute's transcripts aren't the author's to redistribute, so a public build never has more to show than this.

Gateway Forge's Home screen: the climb rail listing every Focus level, Continue, Build a session, Practice statistics all at zero on a fresh install, and the default path listed down the right

Home, and the shell everything else sits in: the climb rail on the left, the workspace in the middle, an inspector on the right. The rail lists every Focus level whether or not anything has been written for it yet — an empty one is a place awaiting content, never an error state.

The Focus 10 level page: measured signal, the Institute's published description, visits, how to get there, and the level's own journal open in the right-hand pane

A level. The measured signal it actually plays, the Institute's published description kept as theirs, and the space for what you found instead — with that level's journal in the right pane rather than behind a separate mode.

The Studio destinations: Production, Session Plans, Listening, Voice, Library, Recently Deleted, System

Studio, where building and maintenance live so Home never has to carry them.

The Windows and Linux build's Home screen: the same climb rail and Focus levels, plus a Library card showing segment, template and voice counts and the on-disk library root path

Windows and Linux, same core, one deliberate difference: the library root is printed on the Home screen instead of tucked away. macOS is the version built for people who never want to go looking inside an app; the cross-platform build assumes the opposite and shows its own file path up front, next to an in-app footprint panel for managing or clearing it.

the trunk — the F27 tape's own seven climbs, F1 through F27 — with spurs branching where the tapes detour: F11 off F10, F18 off F15, F22 off F21, F24 off F23, then F27 continuing to F34, F35, F42, F49.

The relationship is enforced, not just drawn: a check derives the return path by reversing the climb, so adding a level and forgetting its way back fails the build rather than shipping quietly broken.

Measured, from the source material

What the tapes actually play

FFT analysis across all fifty original tapes, keeping only genuine offset pairs (a real binaural signal, not two centred peaks) and weighting by how long each one holds. The whole programme collapses to three signals:

signalbeatcarrierwhere
A4.0 Hz~99–100 HzWave I · Focus 10
B1.50 Hz~99.2 HzWaves II–VI · Focus 12, and parts of 15 & 21
C0.37 Hz~48.8 HzWaves VI–VIII · Focus 21 upward, all of Focus 27

The app never plays a looped recording of these — it regenerates the pair live from the measurement, so the differential can move continuously through a session's transitions instead of cutting at a seam. Transitions sweep rather than glide: the differential widens before it narrows, matching how a transition was actually described rather than a straight linear fade.

Three decisions worth naming

What this app won't do

Published Found — never merged

The Institute's own description and the listener's own account are stored separately and shown together. A level page can disagree with itself on purpose — that's the data, not a bug to reconcile.

A local model that curates, not invents

Session drafting runs on a local Ollama model against the app's own documented material — it proposes an include/omit decision per real segment, never new narration, and nothing reaches the library unreviewed.

Offer, never prescribe

Guidance invites noticing rather than asserting what you'll feel. A placeholder briefing for an unmapped level says so and names the level as unmapped, rather than inventing scenery to fill the gap.

Downloads

Get it

Ad-hoc signed builds, straight from this repository's own release tag — the same ./build.sh and CI packaging anyone can run themselves, just already run.

macOS

Apple Silicon · 82 MiB · v5.2.0

Gatekeeper will refuse an unsigned download by default — right-click the .app and choose Open once, or clear the quarantine flag from Terminal, either of which says you mean to run it.

Windows

x86-64 · 185 MiB installer · v5.2.0

Unsigned, so SmartScreen will warn that the publisher is unknown — a code-signing certificate costs money this project does not spend. Choose More info, then Run anyway, if you trust where you got it.

Linux

x86-64 · 371 MiB AppImage · v5.2.0

The AppImage needs no install — chmod +x it and run. The tarball is the same build, if you would rather place it yourself.

xattr -cr "Gateway Forge.app" is the Terminal route on macOS, run once after unzipping. Every archive's SHA-256 is published as SHA256SUMS on the release page — check it against what you downloaded before you clear any quarantine flag, since that is the point at which verifying still means something.

Or let a script do it

One line, if you would rather not click through the warnings by hand. Each reads the asset names from the release rather than guessing them, verifies the SHA-256 against SHA256SUMS and stops on a mismatch, and clears the quarantine flag (macOS) or the downloaded-file block (Windows) — saying so as it goes. Neither asks for elevated permissions, and neither writes outside the paths it prints.

macOS · Linux
curl -fsSL https://raw.githubusercontent.com/snepssen/gateway-forge/main/install.sh | sh
Windows · PowerShell
irm https://raw.githubusercontent.com/snepssen/gateway-forge/main/install.ps1 | iex
Read it before you run it. Piping a remote script into a shell is exactly the thing worth being suspicious of, and both are short enough to skim first — drop the | sh (or the | iex) and it prints instead of running.

Or build it yourself

macOS · Xcode required
git clone https://github.com/snepssen/gateway-forge.git
cd gateway-forge && ./build.sh
Read the script before you run it — it's short: checks, then swift build, then it assembles and ad-hoc signs the .app. No installer, no elevated permissions, nothing leaves the machine.

The companion

The companion is suspended. Nothing listens on the network and no device can pair — one flag in CompanionService says so, and a check holds every path to it, because a feature that is off in some places and on in others is worse than either. It is set aside rather than removed: GatewayCompanion.xcodeproj, the LAN transport and their suites are all still in the repository, and the phone side will be picked up again.

To take a session to a phone meanwhile, open it and choose Export as WAV. An assembled session.wav is the narration alone — the bed is generated live underneath it while you listen — so the export is a mixdown rather than a copy: the same bed engine, over the plan the session was assembled with, at your own listening levels, written as one stereo file.

componentplatformstatus
Desktop appmacOS 14+, Apple SiliconInstalled daily driver
iOS companioniOS 17+Suspended — the code is still here
Windows / LinuxTypeScript core + Electron shellReleased, checked, unsigned
Windows and Linux are packaged now. cross-platform/ is 59 core modules, 31 check suites and a packaging gate, and a shell drawn on top of them: the climb rail, a level page, a listening calibration, the bed sounding live through the same BedEngine the Mac plays, and the same fine-tuned voice speaking through the same Piper model. Both are imported rather than copied, so the parity suites that hold them to the Swift original are checking the code that actually runs — on real Ubuntu and Windows runners, every push, speech engine and model included.

A build carries an immutable copy of the authored library and installs it to a writable root on first launch; the application never edits its own bundle. What it must not carry is checked as carefully as what it must: a package containing a listener's notes.md, a journal, saved calibration, or the author's private voice is refused outright, and that check is verified by planting those files into a real build and watching it fail.

The phonemizer is why the voice took a vendored WebAssembly build rather than an npm install. The published package carries espeak-ng 1.52.0; this voice was trained with the espeak-ng its trainer pins, 229 commits later, which inserts a linking palatal glide before a following vowel — bˈɑːdiʲ ɐslˈiːp. 147 of the voice's 538 training clips contain it. Measured over 817 calls it was the only difference between the two, so the gap was one espeak version and the answer was to be that version. All 817 now match the macOS engine byte for byte.

Nothing is signed, nothing auto-updates, and neither format can be built on the author's Mac — electron-builder ships an x86_64 mksquashfs and wine64 for macOS hosts — so each platform builds on its own runner and the results are attached to a release.

How it's built

One executable, no cloud, checked by name

Native Swift and SwiftUI throughout, no web engine and no bundled interpreter — the build fails outright on any Python file anywhere in the tree, on purpose. Speech runs through the same Piper/VITS-over-ONNX engine Voice Forge was built to expose, here bundled as a single fixed voice fine-tuned on the author's own speech.

3,812
checks currently passing
49
Focus levels, F1 to F49, every one reachable
3
measured beat signals carrying all fifty source tapes

A checkout of this public copy has its corpus-dependent suites — the ones that read the original tape transcripts or the Institute's manuals — stand down by name instead of either failing on files that were never meant to ship here, or quietly reporting health they never actually looked for. note [source tapes] no tape transcripts in this tree — corpus suites stand down (this is the expected state of a build made for distribution) is what that looks like in practice.

A ledger the app keeps, not the Institute's recordings

The three retained resonant-tuning cues and the wake-up signal that used to come from sampled Monroe tape recordings are now synthesised: the bed generates its own tuning and its own return signal, live, at the measured frequencies above. Nothing sampled from the original tapes ships in this build.

Changelog

What changed

v5.2.0 · 9 September 2026

Export a session as a single stereo file. An assembled session.wav is the narration alone — the bed is generated live underneath it while you listen — so copying that file to a phone would hand over a voice talking into silence. Export mixes it down instead: the same bed engine, over the plan the session was assembled with, at your own listening levels. Open a session and choose Export as WAV, or run gfrender --export-session.

The voice is panned, at last. @pan has been in the script language, and in every session the generator writes, while nothing between the parser and the speakers read it. Headphone Orientation has been asking listeners to confirm they hear the voice in their right ear — an instruction that was unfollowable, and that told anyone wearing their headphones correctly to turn them around. It reaches the audio now, and a check refuses any session that uses that segment without panning. Sessions already on disk are untouched and still play centred; only what is assembled from here on picks it up.

The iOS companion is suspended. Set aside rather than removed — the client, the LAN transport and their checks all remain, and the phone side will be picked up again. Nothing listens on the network and no device can pair meanwhile. Export as WAV covers the reason it existed.

Three bugs found by measuring rather than reading. The pan law is not what Apple's documentation implies — dead centre is unity in both ears and any pan engages constant power normalised to the sides, a 3 dB step rather than a curve, and pan set before the audio graph is running is silently ignored. The bed's master fade-in had been twelve times too slow in the Windows and Linux build since the day it was ported, invisible to a parity suite that compared only samples past the ramp. And the app's own voice lookup broke on a SwiftPM bundle-layout change: it built, passed its packaging gate, and launched offering to rebuild itself with the model sitting two directories away.

v5.1.1 · 6 September 2026

The first release with Windows and Linux builds in it. Both are packaged by CI from the tag, checked before they are built, and published with their checksums — previously only a macOS build existed.

Resonant Tuning is now an original humming exercise. The old segment followed the Institute's own breathing instructions closely; it has been replaced with three level-scoped variants written from first principles — vagal tone, bone conduction, and the fact that humming quieter drives proportionally more vibration into the skull than into the air. Low and in the chest through Focus 10–15; rising through the throat and jaw at 18; deliberately quiet from 21 upward, where it is felt more than heard. Nothing in it is paraphrased from the Institute's material.

The Resonant Energy Balloon becomes the Projected Energy Bubble. The three-strand construction was already the author's own; what is new is the load-bearing logic said out loud — strands at different depths pulling against each other like woven fibre, triangulating into a shell — and a crown-to-feet circuit tied back to the breath rhythm the ocean segment already establishes.

Verbosity now follows practice, per level. Full detail by default; ten completed sessions at a level steps it down to guided, twenty to anchors alone. A month away from a level resets it — earned ease is for someone actively practising there, not a permanent credential. Any level can be held at a chosen verbosity from its own page, and a choice made that way does not decay.

An app icon, and one-line installers for macOS, Linux and Windows that verify checksums before they unpack anything.

Two fixes worth naming because they were real: a fixture was baking journal entries into a file that shipped, and four parity suites asserted against state a distribution build deliberately does not carry — they passed only where the private tree still had the files they should never have read. Both are closed, and npm run check:ci now passes end to end on a fresh checkout as well as in the working tree.

v5.0.0

First public release. macOS only — the native SwiftUI app, the authored library, the live-generated bed, and the ledger that keeps a listener's own practice on their own machine.

Every release, with its full notes and checksums, is on the releases page.

The wider workshop

Five tools, one local-first practice.

Move between guided-meditation authoring, measured speech, lyric video, delivery validation, and the small field tools that support all of them.

Get in touch

If something looks wrong, say so

No analytics, no crash reporter, no way for a failure to reach me on its own. If you build it and something breaks, the version and platform are worth including.