Profile
Back to NewsBack
GitHub Trending 12 min
Reader Mode
eerimoq/moblin: Moblin, a free iOS app for IRL streaming.

eerimoq/moblin: Moblin, a free iOS app for IRL streaming.

10 hours ago

Moblin - IRL Streaming

A free iOS app for IRL streaming. Mainly targeting Twitch, but can stream to YouTube, Kick, Facebook and OBS Studio as well (and probably more).

Website: https://moblin.app

Discord: https://discord.moblin.app

Github: https://github.com/eerimoq/moblin

TestFlight: https://testflight.apple.com/join/PDpxEaGh

Privacy policy: https://eerimoq.github.io/moblin/privacy-policy/en.html

Features

Main app

  • Stream using RTMP, RTMPS, SRT, SRTLA, RIST or WHIP (WebRTC) to any
platform that supports them.
  • Mobcam. Use the phone as a low latency webcam over USB.
- Streams to a computer, for example as a camera source in OBS Studio using the Mobcam OBS Plugin.
  • H.264/AVC and H.265/HEVC video codecs.
  • Up to 4K resolution and 60 FPS. Use 120 FPS at your own risk.
  • SRTLA and RIST.
- Can use one cellular, one WiFi and multiple Ethernet connections simultaneously. Often called bonding. - Upload statistics per active connection. - Connection priorities.
  • Twitch integration.
- Number of viewers. - Chat. - Announcements. - /me styling. - Ban. - Timeout. - Delete message. - Gray out or hide deleted messages. - Show reply. - Optional login. - Follow, subscribe and raid alerts. - Set stream title and category. - Start ads. - Hype train. - Cheered bits in chat. - Stream markers.
  • Kick integration.
- Number of viewers. - Subscription, raid, and kicks. - Level badges. - Chat. - Set stream title and category. - Ban. - Timeout. - Delete message. - Gray out or hide deleted messages. - Show reply.
  • YouTube integration.
- Number of viewers. - Chat. - Multiple video ids at once. - Moderator support. - Optional login. - Create, end and delete streams.
  • SOOP integration.
- Scuffed chat.
  • Open Streaming Platform integration.
- Chat.
  • Basic scenes.
- Alerts widget. - Trigged by Twitch events and chat messages. - Image widget. Show an image on stream. - Text widget. - Any text. - Weather conditions. - Temperature. - Wind. - Timer. - Stopwatch. - Lap times. - Country. - City, area, neighborhood and state. - Subtitles. Speech to text. - Local time. - Speed and average speed. - Altitude, ascent, descent and slope. - Distance. Reset manually. - Heart rate, step count and cycling power. - Bitrate, resolution and FPS. - Latest follower and subscriber. - Debug information. - Muted. - Checkboxes. - Ratings. - Date. - G-force. - Configurable distance, altitude, temperature and speed units. - ... - Browser widget. Show a web page on stream. - Optional style sheet. - Optional JavaScript API access. - Map widget with location. - QR code widget. - Scene widget. - Video source widget (for multi cam). - Snapshot widget. - Chat widget. - Chat emote combo widget. - Slideshow widget. - VTuber and PNGTuber widgets. - Wheel of luck widget. - Bingo card widget. - Crop widget. - Pomodoro timer widget. - Scoreboard widget. - Padel. - Golf, with optional full scorecard. - Basketball. - Hockey. - Football. - Tennis. - Volleyball. - Generic. - ... - Core Image or MetalPetal graphics processing. - ...
  • Back, front or multi camera.
- Front camera mirrored on screen for natural experience.
  • Low energy triple and dual cameras.
  • Back, front, top, bottom or external mic.
- Automatically changes to external mic when connected. - Configurable mic delay.
  • Video stabilization.
  • Zoom.
- Pinch-to-zoom. - Configurable presets.
  • Back camera lens selection.
  • Record to disk (MP4-file).
- Configurable bitrate, video codec and key frame interval.
  • Ingests.
- RTMP, SRT(LA), RIST and WHIP (WebRTC) servers. - SRT, RTSP and WHEP (WebRTC) clients, pulling streams from a server.
  • Localization. Supports many languages, for example English, French,
German, Spanish, Polish, Chinese (Simplified) and Swedish.
  • Tap screen for manual focus.
- Return to auto focus with long press.
  • Stream connection status and uptime.
  • OBS WebSocket (remote control)
- See current scene, streaming state and recording state. - Change scene. - Start and stop the stream. - Snapshot. - Audio levels. - Set audio sync. - Mute/unmute audio inputs. - Edit media source input.
  • Make phone screen black by pressing a button.
  • Stealth mode. Show a custom image instead of the app.
  • Supports UVC (USB-C) cameras on iPad.
  • Basic support for Mac.
- Menu bar icon showing when live and when recording, with a menu to start and stop the stream and the recording.
  • Video effects.
- Grayscale. - Movie. Paint top and bottom of 16:9 video black to look like 2.35:1. - 4:3. Paint left and right of 16:9 video black to look like 4:3. - Sepia. - Noise reduction. - Pixellate. - CRT. - Whirlpool and pinch. - Twin. Show center of image two times. - Triple. Show center of image three times. Experimental. - Blur faces, blur text and blur background. - Beauty filter. - Face effects. Moblin in mouth, glasses and sparkle. - Remove background. - Mask and shape. - Fixed horizon. - Anamorphic lens. - 360 camera dewarp. - Camera man. Automatic panning and zooming. - Random. A single effect that applies a random effect. - ...
  • Alerts.
- Optional text to speech (TTS). - Many voices. - Text message colors, font weight, font design and more. - Select sound and image per alert. - Image placement relative to your face or scene.
  • Chat.
- Alerts filter. - Send messages to Twitch. - Highlight important events. - Optional text to speech (TTS). - Optionally subscribers only. - Many voices. - Detect language per message. - Optionally use TTS.Monster. - Colors, background, border and bold. - Twitch, Kick, BTTV, FFZ and 7TV emotes. - Optionally animated emotes. - Optionally remove old messages. - Width and height. - Optional message timestamp. - Predefined messages. - Moderation.
  • Color spaces (for devices that supports them).
- sRGB. - P3 D65. - Apple Log.
  • Bundled and custom 3D LUT effects.
- Especially useful when using Apple Log.
  • Battery indicator.
- Charging icon. - Optionally with percentage.
  • Web browser.
- Only visible to the streamer.
  • Game controllers for remote control.
- Zoom in and out. - Change scene. - Torch. - Mute. - Pan and tilt gimbal with thumb sticks. - ...
  • Stream Deck support.
  • Keyboard shortcuts.
  • Selfie stick button support.
  • Moblink for more connection.
  • Low light boost.
  • Cosmetics.
- Select Moblin icon to show in app and on home screen. - Optionally purchase additional Moblin icons to support developers.
  • Configure stream resolution, FPS, video codec, bitrate and more.
  • Configurable bitrate presets.
  • Adaptive bitrate for SRT(LA), RIST and RTMP.
  • Macros. Run a sequence of actions, optionally repeatedly.
- Enable/disable scene widgets, switch scene, delay and more.
  • Optionally remote control the streamer's Moblin app over the network.
- Shows basic status information. - Change scene. - Change mic. - Change bitrate. - Change zoom. - Control gimbal. - Update scoreboards. - Save and play replays. - Import settings. - Show logs. - Video preview. - ...
  • Web remote control. Control the streamer's Moblin app from a web
browser.
  • Torch.
- Configurable brightness.
  • Mute audio.
  • Talkback.
  • Deep link settings (moblin://).
- Including a deep link creator for service providers.
  • Landscape.
- Both 0 and 180 degrees orientation. Video always with gravity down (never upside down).
  • Portrait.
- UI in portrait, but video in landscape. To be improved.
  • Background streaming.
- With audio. - Video will be a freezed frame as video cannot be captured in background.
  • Simple poll.
- Chat types 1, 2 or 3.
  • Chat bot.
- Commands. - Turn chat text to speech on an off. - Fix OBS. - Map zoom out. - Trigger alerts. - Fax. - Turn filters on and off. - Let chat take snapshot. - Change scene. - Set stream title and category. - Ask AI. - Move gimbal to preset. - Run macros. - Control Apple Music. - Spin the wheel of luck. - ... - Send low battery warning to chat periodically.
  • Screen capture as video source.
  • Basic video player as video source and mic.
  • Apple Music control. Experimental.
  • DJI camera Bluetooth controller.
- Automatically start DJI camera live stream. - Tested with OA4, OA3, OA6, OP3 and Pocket 4.
  • GoPro QR-code creator.
  • Show grid for easier positioning.
  • Camera settings (on some cameras).
- Exposure bias. - White balance. - ISO. - Focus.
  • Cat printer.
- Print chat and faxes (images). - Optional meow sound when printing.
  • Black Shark cooler support.
  • Take snapshots.
- And optionally automatically upload to your Discord server.
  • Photo shoot. Take clean pictures periodically.
  • Save and play replays.
- Including instant replay.
  • Tesla vehicle status and control.
  • Support for DockKit gimbals.
- Presets, tracking and zoom.
  • Cycling power monitor.
  • Heart rate monitor.
  • Workout. Walking, running and cycling.
  • Show video on external display. Aka clean HDMI out.
  • Basic VTuber and PNGTuber.
  • Auto scene switcher.
  • Disconnect protection. Automatically switch to a fallback scene when
the video source disconnects.
  • Navigation. Walking, cycling and driving directions.
- Only visible to the streamer.
  • RTMP(S) multi streaming.
  • Preview stream. Low bitrate copy of the stream.

Apple Watch companion app

  • Stream preview.
  • Show audio level.
  • Show bitrate.
  • Show number of viewers.
  • Show iPhone thermal state.
  • Chat.
- Limited to 50 messages.
  • Control.
- Zoom using digital crown and presets. - Switch scene. - Go live. - Record. - Mute. - Skip current TTS message. - Instant replay and save replay. - Create stream marker. - Start and stop workout.
  • Scoreboards.
- Padel and generic.
  • Watch face complication.

Import settings using moblin:// (custom URL)

Examples

New stream

An example creating a new stream is

moblin://?{"streams":[{"name":"BELABOX%20UK","url":"srtla://uk.srt.belabox.net:5000?streamid=9812098rh9hf8942hid","video":{"codec":"H.265/HEVC"},"obs":{"webSocketUrl":"ws://123.22.32.112:5465","webSocketPassword":"foobar"}}]}

where the URL decoded pretty printed JSON blob is

`` json { "streams": [ { "name": "BELABOX UK", "url": "srtla://uk.srt.belabox.net:5000?streamid=9812098rh9hf8942hid", "video": { "codec": "H.265/HEVC" }, "obs": { "webSocketUrl": "ws://123.22.32.112:5465", "webSocketPassword": "foobar" } } ] }

### Quick button settings

An example with only two quick buttons enabled is

moblin://?{"quickButtons":{"twoColumns":false,"showName":true,"enableScroll":true,"disableAllButtons":true,"buttons":[{"type":"Mute","enabled":true},{"type":"Draw","enabled":true}]}}
where the URL decoded pretty printed JSON blob is
json { "quickButtons": { "twoColumns": false, "showName": true, "enableScroll": true, "disableAllButtons": true, "buttons": [ { "type": "Mute", "enabled": true }, { "type": "Draw", "enabled": true } ] } }
## Specification

Format: moblin://?<URL encoded JSON blob>

The MoblinSettingsUrl class in MoblinSettingsUrl.swift defines the JSON blob format. Class members are JSON object keys. Members with ? after the type are optional.

Browser widget JavaScript API

Get access to various data in your Browser widget.

NOTE: You must enable Settings -> Scenes -> My browser widget -> Moblin access to give the website access to the Browser widget JavaScript API.

Example

Add this code to your website to receive chat messages with prefix !.

js moblin.subscribe({ chat: { prefix: "!" } }); moblin.onmessage = (message) => { if (message.chat !== undefined) { console.log(message.chat.message); } };
Add this code to your website to receive the speech to text
transcript. You must enable Settings -> Scenes -> My browser widget
-> Speech to text as well. text is a sliding window of the latest
transcript and position is the offset of its first character,
counted from when speech to text started. The transcript is cleared
after a few seconds of silence.
js moblin.subscribe({ speechToText: {} }); moblin.onmessage = (message) => { if (message.speechToText !== undefined) { console.log(message.speechToText.position, message.speechToText.text); } if (message.speechToTextClear !== undefined) { console.log("Transcript cleared"); } };
Add this code to your website to write a message to Moblin's log.
js moblin.log("Hello from my browser widget!");
## Specification

Topics to subscribe to are defined by SubscribeTopic in BrowserEffectServer.swift.

Messages passed to onmessage are defined by Message in BrowserEffectServer.swift.

Similar software

  • https://irlpro.app/
  • Twitch app.
  • https://softvelum.com/larix/ios/

Development environment setup

Build the project

Roughly the steps to setup Moblin's developement environment.

  1. Install Xcode with iOS and MacOS simulators on your Mac.
  1. Open a terminal.
  1. Clone Moblin.
git clone https://github.com/eerimoq/moblin.git
  1. Enter Moblins repository.
cd moblin
  1. Create Config/User.xcconfig. This file contains user specific
settings and is not under version control.

cp User.template.xcconfig Config/User.xcconfig

  1. Open the Moblin project in Xcode. Wait for the dependencies to load.
open Moblin.xcodeproj
  1. Modify Config/User.xcconfig in Xcode.
  1. Press Command + B to build Moblin.
  1. Enable developer mode in your iPhone/iPad.
  1. Select you iPhone/iPad as Run Destination in Xcode (at the top in
the middle).
  1. Build and run by pressing Command + R.
  1. Done!

Styling, linting and more

  1. Install tools.
brew install just brew install swiftlint brew install swiftformat brew install codespell brew install oxfmt brew install oxlint brew install python3.14 python3.14 -m venv .venv source .venv/bin/activate pip install -r requirements.txt -U
2. Perform styling, linting and more.
source .venv/bin/activate # Once per shell is enough. just style lint spell-check
3. Done!

Web remote control frontend

It's built with SolidJS.

  1. Install dependencies.
just web-remote-control-frontend-prepare
  1. Modify files in WebRemoteControlFrontend/.
  1. Build to update files in Moblin/RemoteControl/Web/*.
just web-remote-control-frontend-build
  1. Done!

Twitch login callback server

Twitch login uses ASWebAuthenticationSession with an https://mys-lang.org/auth callback. For iOS to hand the callback to Moblin, mys-lang.org must serve an Apple App Site Association file that lists Moblin's app identifier, and Moblin's entitlements must contain webcredentials:mys-lang.org (they already do).

  1. Create .well-known/apple-app-site-association (no file extension) with
the following content.
json { "webcredentials": { "apps": [ "L82N7LD4N5.com.eerimoq.Mobs" ] } }
2. Serve it over HTTPS as application/json in nginx.
nginx location /.well-known/apple-app-site-association { default_type application/json; }
`
  1. Reload nginx.
sudo nginx -s reload
  1. Verify that it is served.
curl -i https://mys-lang.org/.well-known/apple-app-site-association`
  1. Done!
Apple's CDN caches the file, so it may take a while before a change reaches devices.
Chat with me