A private iOS/iPadOS reader and voice-capture tool for the Markdown and HTML files that live on your own machines — reached over Tailscale via SSH/SFTP.
Helm is a focused notes app, not a terminal. You add a host (like an
~/.ssh/config entry), it connects over your tailnet, you browse to a .md/.html
file, and it renders cleanly — headings, code blocks, tables, dark mode. You can
also record a voice note, transcribe it on device, review the Markdown, and save it
back over SFTP. No companion server runs on your machines; Helm uses the SSH server
that's already there.
Your notes and wikis already live on your laptop, NAS, or VPS. Tailscale already makes those machines reachable from anywhere. Helm is the missing piece: a focused, elegant way to read that Markdown on your phone — without copying files around, running a sync service, or settling for a raw-text SSH client.
- SSH/SFTP browsing — folders and
.md/.markdown/.htmlfiles only, sortable newest- or oldest-first. - Styled reader — Markdown rendered to themed HTML (light/dark) via swift-markdown; HTML files render directly.
- Three auth methods — Tailscale SSH (keyless), private key (OpenSSH ed25519/RSA, optional passphrase), or password. Secrets live in the iOS Keychain.
- Shortcuts — star files and folders; they sit on the home screen for one-tap access.
- Live host status, in-document links + table of contents, chronological
full-text search (server-side
grepplus SFTP modification dates), offline cache, and read-aloud. - Markdown editing — edit a page and save it back over SFTP with conflict detection.
- Voice notes — record on device, transcribe with Speech, review/edit Markdown,
and save under the wiki root's
transcriptsfolder over SFTP. - Page change requests — speak feedback while reading Markdown or HTML; Helm writes
a structured request to
.helm/requests/pendingfor the separate machine-side coding workflow. - Ask about this doc (iOS 26+) — on-device Foundation Models answer questions about the current file, fully private, no network.
- Minimal settings — reader text size, clear-cache, and voice-capture destination.
- iOS/iPadOS 17+ ("Ask" and voice-note cleanup require iOS 26 + Apple Intelligence).
- Xcode 26+, XcodeGen (
brew install xcodegen). - The Tailscale app installed and connected on the device — it provides the network path to your machines. Helm does not establish the tunnel itself.
brew install xcodegen # one-time
make generate # generates Helm.xcodeproj from project.yml
make build # build for the simulator
make test # run the test suiteTo run on a device, set your Apple Developer Team ID in Signing.xcconfig (copied
from Signing.xcconfig.example on first make generate; it's gitignored), then:
make install-device DEVICE_ID=<your-device-id> # see: xcrun devicectl list devices
make install-maru # Ali's iPad Maru- SwiftUI, Swift 6, strict concurrency. No app-level state outside
AppState. SFTPBrowser— connection-pooled SSH/SFTP via Citadel (SwiftNIO SSH). Browsing, reading, dated search, conflict-aware replacement, and queued writes share the same connection path.MarkdownHTMLRenderer+HTMLTheme— CommonMark/GFM → styled HTML in aWKWebView.CaptureSession— records audio, transcribes locally, formats Markdown, and writes it over SFTP.- Keychain for all credentials; UserDefaults for host metadata and favorites.
See PRODUCT_GOAL.md for the product shape and
TAILSCALE_SSH_SETUP.md for enabling keyless access.
Helm does not launch an agent or arbitrary shell command. It leaves a durable handoff under
.helm/requests/pending in the configured wiki root. In the separate coding-agent view, ask
the agent to process the pending Helm requests from that directory. Each request identifies
the target path, format, timestamp, and spoken instruction; HTML requests explicitly direct
the agent to find the canonical source before editing.
- v2 — surface pending/completed page change requests and their diffs in Helm.
- v3 — chat across the whole wiki while keeping edits review-gated.