Skip to the content

Self-hosted meditation manager · Open source · MIT

Play, plan and keep a meditation practice.

A practice manager over the meditation audio already in your folders — read-only, nothing renamed. Play it, plan against it, and keep an honest record of what you actually sat for.

  • Your folders stay read-only
  • No cloud account, no telemetry
  • AI only if you bring a key
BreatheFocus mode
Bells every 5 min4 in · 1 hold · 6 outFelt, not just seen

The loop

Not a library with a timer bolted onto it.

A practice has a shape, and it is a circle. ZenPort is built around that shape rather than around a file browser.

  1. Arrive

    Today opens on one suggestion and what you were part-way through — never a wall of files.

  2. Practice

    Play something, or breathe with nothing playing at all.

  3. Reflect

    A short sheet afterwards — how settled it felt, a tag, a voice note. Or skip it.

  4. Plan

    A practice or a learning plan, drafted by hand or by AI, on a timeline that forgives a missed day.

  5. Review

    Statistics assembled only from sits that actually happened.

Nothing here guesses what you practised. It only knows what you did.

Play

A full-screen player built for meditation, not for music — settling lead-in, interval bells, a gentle fade-out, and a mini-player that survives navigation. Or breathe with nothing playing.

Plan

Practice plans and learning plans, with an intention, a cadence and a target. A missed day is recorded as information, never as failure.

Keep

Every sit records what you actually listened to. Those sessions are the only source for your statistics, which is why a quiet week is allowed to look quiet.

The scanner

It reads. It never writes.

The worst thing a media app can do to a library somebody spent years assembling is have an opinion about it. So the scanner works only from the structure you already made — and it will show you its reasoning for every single thing it decided.

/library/meditationsread-only

Wren Calloway/
Evening Current/
cover.png
01 - Settling In.m4a
02 - The Long Exhale.m4a
03 - Coming Back.m4a
notes.pdf

What it concluded, and why

Creator
Wren Calloway
top-level folder name
Collection
Evening Current
folder holding the audio
Tracks
3, in that order
leading track numbers in the filenames
Cover
cover.png
image beside the audio, not embedded art
Companion
notes.pdf
document beside the audio

An invented library, not anyone’s real one. ZenPort has no idea what is in yours, and neither does this page.

  • No AI, no fuzzy matching, no fetching metadata about you from anywhere.
  • Rescans are idempotent — running one twice changes nothing at all.
  • A file that vanishes is marked missing, never deleted, and your history survives it.
  • Every inference has an evidence trail you can open and read.

Cover art

An untagged shelf still reads as distinct things.

Most of a self-hosted library has no artwork at all, and a letter on a flat tint makes thirty recordings look like a spreadsheet. So anything without a cover is painted one, picked by a hash of its creator and title — and if an image ever fails, it falls back to arcs drawn from the logo’s own sweep, below.

Either way it is deterministic. Cover art that reshuffles on reload is worse than none, because you can no longer find things by their look.

Not a mockup: this page imports the app’s own fallback function and runs it at build time. The eight titles are invented — any eight strings make the point, and real ones would only publish somebody’s library.

  • Evening Current · Settling In

  • The Long Exhale

  • Ten Slow Minutes

  • Rain on the Roof

  • Before Sleep, Briefly

  • Walking Without Arriving

  • A Steady Place

  • Coming Back

In the app

Everything else it does.

It knows a course from a meditation

Every item is a meditation, course, talk or soundscape — guessed from your folders, corrected by you, and never un-corrected by a rescan. Courses count lessons, and pick up where you stopped.

Plan with AI, on your own key

Add your own OpenAI key and a three-step sheet drafts a plan from your library: titles, creators and lengths only, named to the model by short handles. It proposes; nothing is saved until you accept.

Video, and a player that behaves

Full-screen stage, picture-in-picture, a scrubber that previews while you drag. Audio keeps its own element, so a meditation still plays with the screen locked.

Feel the breath

The breath guide can be felt as well as seen: taps that gather and lengthen through the in-breath, and spread and soften through the out-breath.

A private journal

A reflection sheet after each sit — how settled it felt, a tag, a voice note. Markdown export, and no admin backdoor into anybody’s journal.

Everything one key away

⌘K opens a palette over every meditation, page and preference. Four accents, and a folder switch for anything you would rather it did not index.

Non-root runtime, CSRF, rate-limited loginInstalls as a PWALock-screen controls where browsers allow them

Self-hosting

One container, one port, your folders.

SQLite in a named volume, your library mounted read-only, a non-root runtime, and first-run admin setup with no default credentials. Until you point it somewhere real it serves a bundled sample library, so you can feel the app first.

# get it
git clone 
  https://github.com/ilanKushnir/zenport.git
cd zenport
cp .env.example .env

# in .env
ZP_SESSION_SECRET=$(openssl rand -hex 32)
ZP_MEDITATION_PATH=/srv/media/meditations

# run it
docker compose up -d --build

Then open http://<host>:8484 and create your admin account.

The two mounts

/library/meditations
read-only — your folders, any nesting.
/data
read-write — ZenPort’s own database and your voice notes. Nothing else.

Audio: .mp3 .m4a .m4b .flac .ogg .opus .wav .aac · Covers: .jpg .png .webp .avif · Documents: .pdf .txt .md .html

Before you expose it

It holds private journals and listening history. Put HTTPS and a reverse proxy in front of it, and read docs/security.md for the honest version of what it does and does not protect you from.

Questions

The ones worth asking first.

Will ZenPort touch my files?
No. The library mount is read-only at the container level, so it is not a promise in the code — it is a promise the kernel keeps. ZenPort writes only to its own /data volume.
Does it use AI on my library?
The scanner never does — it infers creators, collections and track order from folder structure alone, and will show you the evidence for every decision. Two things can, and both are off until you turn them on with a key of your own: drafting a plan, which sends titles, creators and lengths (never audio, never ids) to OpenAI on your key; and transcribing voice notes through a Whisper-compatible endpoint you point at yourself.
Does it phone home?
There is no cloud account and no telemetry. Every outbound call is one you switch on: your own OpenAI key for planning, your own yt-dlp for YouTube metadata, and YouTube’s privacy-enhanced embed, which only loads after you tap a video.
What does it cost, and what is the licence?
Nothing, and MIT. It is one container on a machine you already have. It is also early — v0.6, moving fast, with the rough edges written down in the repo.

You already have the meditations.

This is the calm place to keep them, and the honest record of what you did with them. Free, MIT, and running on a machine in your own house.

Latest release on GitHub · MIT licence