{"id":18913581,"url":"https://github.com/eerimoq/moblin","last_synced_at":"2025-05-16T13:03:31.280Z","repository":{"id":190801224,"uuid":"680010704","full_name":"eerimoq/moblin","owner":"eerimoq","description":"Moblin, a free iOS app for IRL streaming.","archived":false,"fork":false,"pushed_at":"2025-05-11T10:16:43.000Z","size":61153,"stargazers_count":312,"open_issues_count":39,"forks_count":32,"subscribers_count":14,"default_branch":"main","last_synced_at":"2025-05-11T11:25:38.151Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eerimoq.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"eerimoq"}},"created_at":"2023-08-18T06:16:36.000Z","updated_at":"2025-05-11T10:19:47.000Z","dependencies_parsed_at":"2023-09-26T10:41:08.205Z","dependency_job_id":"9f41efa8-47e4-49de-ac6c-73bbd8ab5fbd","html_url":"https://github.com/eerimoq/moblin","commit_stats":null,"previous_names":["eerimoq/mobs","eerimoq/moblin"],"tags_count":583,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eerimoq%2Fmoblin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eerimoq%2Fmoblin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eerimoq%2Fmoblin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eerimoq%2Fmoblin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eerimoq","download_url":"https://codeload.github.com/eerimoq/moblin/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254535826,"owners_count":22087398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T10:08:18.940Z","updated_at":"2025-05-16T13:03:31.272Z","avatar_url":"https://github.com/eerimoq.png","language":"Swift","readme":"[\u003cimg src=\"docs/app-store.svg\"\u003e](https://apps.apple.com/app/id6466745933)\n\n# Moblin - IRL Streaming\n\nA free iOS app for IRL streaming. Mainly targeting [Twitch](https://twitch.tv), but can\nstream to [YouTube](https://youtube.com), [Kick](https://kick.com), [Facebook](https://facebook.com)\nand [OBS Studio](https://obsproject.com) as well (and probably more).\n\n\u003cp\u003e\n    \u003cimg src=\"https://github.com/eerimoq/moblin/raw/main/docs/iphone15-pro-max-screenshot.png\" width=\"62%\" \u003e\n    \u003cimg src=\"https://github.com/eerimoq/moblin/raw/main/docs/watch-series-9-screenshot.png\" width=\"17%\" \u003e\n    \u003cimg src=\"https://github.com/eerimoq/moblin/raw/main/docs/watch-series-9-screenshot-chat.png\" width=\"17%\" \u003e\n\u003c/p\u003e\n\nDiscord: https://discord.gg/nt3UwHqbMM\n\nGithub: https://github.com/eerimoq/moblin\n\nTestFlight: https://testflight.apple.com/join/PDpxEaGh\n\n# Features\n\n## Main app\n\n- Stream using RTMP, RTMPS, SRT or SRTLA to any platform that supports\n  them.\n- H.264/AVC and H.265/HEVC video codecs.\n- Up to 4K resolution and 60 FPS.\n- SRTLA.\n  - Can use one cellular, one WiFi and multiple Ethernet connections\n    simultaneously. Often called bonding.\n  - Upload statistics per active connection.\n- Twitch integration.\n  - Number of viewers.\n  - Chat.\n    - Announcements.\n    - /me styling.\n  - Optional login.\n    - Follow, subscribe and raid alerts.\n    - Start ads.\n    - Hype train.\n    - Cheered bits in chat.\n- Kick integration.\n  - Number of viewers.\n  - Chat.\n- YouTube integration.\n  - Chat.\n- AfreecaTv integration.\n  - Scuffed chat.\n- Basic scenes.\n  - Alerts widget.\n    - Trigged by Twitch events and chat messages.\n  - Image widget. Show an image on stream.\n  - Text widget.\n    - Any text.\n    - Weather conditions.\n    - Temperature.\n    - Timer.\n    - Country.\n    - City.\n    - Subtitles. Speech to text.\n    - Local time.\n    - Speed.\n    - Altitude.\n    - Distance. Reset manually.\n    - Debug information.\n    - Muted.\n    - Checkboxes.\n    - Ratings.\n    - Date.\n    - ...\n  - Browser widget. Show a web page on stream.\n    - Optional style sheet.\n  - Map widget with location.\n  - QR code widget.\n  - Scene widget.\n  - Video soure widget (for multi cam).\n  - ...\n- Back, front or multi camera.\n  - Front camera mirrored on screen for natural experience.\n- Low energy truple and dual cameras.\n- Back, front, top, bottom or external mic.\n  - Automatically changes to external mic when connected.\n- Video stabilization.\n- Zoom.\n  - Pinch-to-zoom.\n  - Configurable presets.\n- Back camera lens selection.\n- Record to disk (MP4-file).\n  - Configurable bitrate, video codec and key frame interval.\n- RTMP server/ingest as video source.\n- SRT(LA) server/ingest as video source.\n- Localization. Supports many languages, for example English, French,\n  German, Spanish, Polish, Chinese (Simplified) and Swedish.\n- Tap screen for manual focus.\n  - Return to auto focus with long press.\n- Stream connection status and uptime.\n- OBS WebSocket (remote control)\n  - See current scene, streaming state and recoring state.\n  - Change scene.\n  - Start and stop the stream.\n  - Snapshot.\n  - Audio levels.\n  - Set audio sync.\n  - Mute/unmute audio inputs.\n- Make phone screen black by pressing a button.\n- Supports UVC (USB-C) cameras on iPad.\n- Basic support for Mac.\n- Video effects.\n  - Grayscale.\n  - Movie. Paint top and bottom of 16:9 video black to look like\n    2.35:1.\n  - 4:3. Paint left and right of 16:9 video black to look like 4:3.\n  - Seipa.\n  - Noise reduction.\n  - Random. A single effect that applies a random effect.\n  - Triple. Show center of image three times. Experimental.\n- Alerts.\n  - Optional text to speech (TTS).\n    - Many voices.\n  - Text message colors, font weight, font design and more.\n  - Select sound and image per alert.\n  - Image placement relative to your face or scene.\n- Chat.\n  - Alerts filter.\n  - Send messages to Twitch.\n  - Highlight important events.\n  - Optional text to speech (TTS).\n    - Optionally subscribers only.\n    - Many voices.\n    - Detect language per message.\n  - Colors, background, border and bold.\n  - Twitch, Kick, BTTV, FFZ and 7TV emotes.\n  - Optionally animated emotes.\n  - Optionally remove old messages.\n  - Width and height.\n  - Optional message timestamp.\n- Color spaces (for devices that supports them).\n  - sRGB.\n  - P3 D65.\n  - Apple Log.\n- Bundled and custom 3D LUT effects.\n  - Especially useful when using Apple Log.\n- Battery indicator.\n  - Charging icon.\n  - Optionally with percentage.\n- Web browser.\n  - Only visible to the streamer.\n- Game controllers for remote control.\n  - Zoom in and out.\n  - Change scene.\n  - Torch.\n  - Mute.\n  - ...\n- Moblink for more connection.\n- Low light boost.\n- Cosmetics.\n  - Select Moblin icon to show in app and on home screen.\n  - Optionally purchase additional Moblin icons to support developers.\n- Configure stream resolution, FPS, video codec, bitrate and more.\n- Configurable bitrate presets.\n- Adaptive bitrate for SRT(LA).\n- Optionally remote control the streamer's Moblin app over the network.\n  - Shows basic status information.\n  - Change scene.\n  - Change mic.\n  - Change bitrate.\n  - Change zoom.\n  - Show logs.\n  - ...\n- Torch.\n- Mute audio.\n- Deep link settings (moblin://).\n  - Including a deep link creator for service providers.\n- Landscape.\n  - Both 0 and 180 degrees orientation. Video always with gravity down\n    (never upside down).\n- Portrait.\n  - UI in portrait, but video in landscape. To be improved.\n- Background streaming.\n  - With audio.\n  - Video will be a freezed frame as video cannot be captured in background.\n- Simple poll.\n  - Chat types 1, 2 or 3.\n- Chat bot.\n  - Commands.\n    - Turn chat text to speech on an off.\n    - Fix OBS.\n    - Map zoom out.\n    - Trigger alerts.\n    - Fax.\n    - Turn filters on and off.\n    - Let chat take snapshot.\n    - ...\n  - Send low battery warning to chat periodically.\n- Screen capture as video source.\n- Basic video player as video source and mic.\n- DJI camera Bluetooth controller.\n  - Automatically start DJI camera live stream.\n  - Tested with OA4, OA3 and OP3.\n- GoPro QR-code creator.\n- Show grid for easier positioning.\n- Camera settings (on some cameras).\n  - Exposure bias.\n  - White balance.\n  - ISO.\n  - Focus.\n- Cat printer.\n  - Print chat and faxes (images).\n  - Optional meow sound when printing.\n- Take snapshots.\n  - And optionally automatically upload to your Discord server.\n- Save and play replays.\n- Tesla vehicle status and control.\n- Cycling power monitor.\n- Heart rate monitor.\n- Show video on external dispaly. Aka clean HDMI out.\n\n## Apple Watch companion app\n\n- Stream preview.\n- Show audio level.\n- Show bitrate.\n- Show iPhone thermal state.\n- Chat.\n  - Limited to 50 messages.\n- Control.\n  - Zoom using digital crown and presets.\n  - Switch scene.\n  - Go live.\n  - Record.\n  - Mute.\n  - Skip current TTS message.\n- Watch face complication.\n\n# Import settings using moblin:// (custom URL)\n\n## Examples\n\n### New stream\n\nAn example creating a new stream is\n\n```\nmoblin://?{\"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\"}}]}\n```\n\nwhere the URL decoded pretty printed JSON blob is\n\n``` json\n{\n  \"streams\": [\n    {\n      \"name\": \"BELABOX UK\",\n      \"url\": \"srtla://uk.srt.belabox.net:5000?streamid=9812098rh9hf8942hid\",\n      \"video\": {\n        \"codec\": \"H.265/HEVC\"\n      },\n      \"obs\": {\n        \"webSocketUrl\": \"ws://123.22.32.112:5465\",\n        \"webSocketPassword\": \"foobar\"\n      }\n    }\n  ]\n}\n```\n\n### Quick button settings\n\nAn example with only two quick buttons enabled is\n\n```\nmoblin://?{\"quickButtons\":{\"twoColumns\":false,\"showName\":true,\"enableScroll\":true,\"disableAllButtons\":true,\"buttons\":[{\"type\":\"Mute\",\"enabled\":true},{\"type\":\"Draw\",\"enabled\":true}]}}\n```\n\nwhere the URL decoded pretty printed JSON blob is\n\n``` json\n{\n  \"quickButtons\": {\n    \"twoColumns\": false,\n    \"showName\": true,\n    \"enableScroll\": true,\n    \"disableAllButtons\": true,\n    \"buttons\": [\n      {\n        \"type\": \"Mute\",\n        \"enabled\": true\n      },\n      {\n        \"type\": \"Draw\",\n        \"enabled\": true\n      }\n    ]\n  }\n}\n```\n\n## Specification\n\nFormat: `moblin://?\u003cURL encoded JSON blob\u003e`\n\nThe `MoblinSettingsUrl` class in\n[MoblinSettingsUrl.swift](https://github.com/eerimoq/moblin/blob/main/Moblin/Various/MoblinSettingsUrl.swift) defines\nthe JSON blob format. Class members are JSON object keys. Members with\n`?` after the type are optional. Some types are defined in\n[Settings.swift](https://github.com/eerimoq/moblin/blob/main/Moblin/Various/Settings.swift).\n\n# Browser widget JavaScript API\n\nGet access to various data in your Browser widget.\n\nNOTE: You must enable `Settings -\u003e Scenes -\u003e My browser widget -\u003e Moblin\naccess` to give the website access to the Browser widget JavaScript\nAPI.\n\n## Example\n\nAdd this code to your website to receive chat messages with prefix `!`.\n\n```js\nmoblin.subscribe({ chat: { prefix: \"!\" } });\nmoblin.onmessage = (message) =\u003e {\n  if (message.chat !== undefined) {\n    console.log(message.chat.message);\n  }\n};\n```\n\n## Specification\n\nTopics to subscribe to are defined by `SubscribeTopic` in\n[BrowserEffectServer.swift](https://github.com/eerimoq/moblin/blob/main/Moblin/VideoEffects/BrowserEffect/BrowserEffectServer.swift).\n\nMessages passed to `onmessage` are defined by `Message` in\n[BrowserEffectServer.swift](https://github.com/eerimoq/moblin/blob/main/Moblin/VideoEffects/BrowserEffect/BrowserEffectServer.swift).\n\n# Similar software\n\n- https://irlpro.app/\n- Twitch app.\n- https://softvelum.com/larix/ios/\n\n# Development environment setup\n\nRoughly the steps to setup Moblin's developement environment.\n\n1. Install Xcode with iOS and MacOS simulators on your Mac.\n\n2. Open a terminal.\n\n3. Clone Moblin.\n\n   `git clone https://github.com/eerimoq/moblin.git`\n\n4. Enter Moblins repository.\n\n   `cd moblin`\n\n5. Open the Moblin project in Xcode. Wait for the dependencies to load.\n\n   `open Moblin.xcodeproj`\n\n6. Press `Command + B` to build Moblin.\n\n7. Click on the code signing error and add your account. No Apple\n   developer account is needed.\n\n8. Change the `Bundle Identifier` to anything you want (i.e. `com.whoami.Moblin`).\n\n9. Remove `In-App Purchase` and `Access Wi-Fi Information` by clicking\n   their trash cans.\n\n10. Build again. Hopefully successfully.\n\n11. Enable developer mode in your iPhone/iPad.\n\n12. Select you iPhone/iPad as `Run Destination` in Xcode (at the top\n    in the middle).\n\n13. Build and run by pressing `Command + R`.\n\n14. Done!\n","funding_links":["https://github.com/sponsors/eerimoq"],"categories":["Media"],"sub_categories":["Video"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feerimoq%2Fmoblin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feerimoq%2Fmoblin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feerimoq%2Fmoblin/lists"}