<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Super Funicular</title>
    <description>The latest articles on DEV Community by Super Funicular (@superfunicular).</description>
    <link>https://dev.to/superfunicular</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3905292%2F0eab2966-f7d2-41d0-983d-d240a6caa5d4.jpg</url>
      <title>DEV Community: Super Funicular</title>
      <link>https://dev.to/superfunicular</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/superfunicular"/>
    <language>en</language>
    <item>
      <title>Why Your Camera App Should Not Need an Account or Cloud Storage</title>
      <dc:creator>Super Funicular</dc:creator>
      <pubDate>Thu, 30 Apr 2026 07:57:14 +0000</pubDate>
      <link>https://dev.to/superfunicular/why-your-camera-app-should-not-need-an-account-or-cloud-storage-1j50</link>
      <guid>https://dev.to/superfunicular/why-your-camera-app-should-not-need-an-account-or-cloud-storage-1j50</guid>
      <description>&lt;h2&gt;
  
  
  The State of Camera Apps in 2026
&lt;/h2&gt;

&lt;p&gt;Most camera and security camera apps today require you to create an account, upload your footage to their cloud servers, and often pay a monthly subscription for the privilege of accessing your own recordings. Ring, Nest, Arlo, Alfred Camera, Wyze — they all follow the same model: your video goes to their servers, and you pay to get it back.&lt;/p&gt;

&lt;p&gt;This creates several problems that are not immediately obvious.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 1: You Do Not Own Your Footage
&lt;/h2&gt;

&lt;p&gt;When your video is on someone elses server, it is subject to their terms of service, their data retention policies, and their cooperation with law enforcement. Cloud camera companies have handed over footage to police without user consent. Your private security camera footage is not as private as you think.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 2: Subscriptions Add Up
&lt;/h2&gt;

&lt;p&gt;Ring Protect starts at $3.99/month per camera. Nest Aware is $8/month. Arlo Secure is $7.99/month. If you have multiple cameras, you are looking at $20-40/month just to store and access your own video. That is $240-480/year, every year, forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 3: No Internet = No Camera
&lt;/h2&gt;

&lt;p&gt;Cloud-dependent cameras become expensive paperweights when your internet goes down. The camera might still record locally for a short time, but you lose remote access, alerts, and often the ability to review footage until the connection is restored.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 4: Data Breaches
&lt;/h2&gt;

&lt;p&gt;Every cloud service is a target. Ring has had security incidents. Wyze accidentally exposed customer data. The more places your video data lives, the more opportunities for it to be compromised.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Alternative: Local-Only Recording
&lt;/h2&gt;

&lt;p&gt;A camera app that stores everything on your device eliminates all four problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You own your footage.&lt;/strong&gt; It is on your phones storage. No one can access it without physical access to your device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No subscriptions.&lt;/strong&gt; Local storage is free. You already paid for the storage when you bought your phone or SD card.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline.&lt;/strong&gt; Recording continues regardless of internet connectivity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No breach risk.&lt;/strong&gt; Your footage is not on any server. There is nothing to breach.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to Look For
&lt;/h2&gt;

&lt;p&gt;If privacy matters to you, here is what to look for in a camera app:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No account required.&lt;/strong&gt; If an app requires you to create an account to use basic features, ask why. Recording video does not need a login.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local storage by default.&lt;/strong&gt; Recordings should go to your device storage, not to a cloud server. Cloud should be an opt-in feature, not a requirement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No analytics or telemetry.&lt;/strong&gt; Check the apps privacy policy. Does it send usage data, crash reports, or device information to third-party analytics services?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transparent permissions.&lt;/strong&gt; A camera app needs camera and microphone permissions, obviously. But does it also request contacts, phone state, or account access? Those are red flags.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optional cloud features.&lt;/strong&gt; If you want remote access, the app should let you choose your own method — like YouTube Live streaming to a private unlisted stream, rather than forcing you through their proprietary cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building with Privacy in Mind
&lt;/h2&gt;

&lt;p&gt;When I built Background Camera RemoteStream, privacy-first was a core design decision, not an afterthought:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No accounts.&lt;/strong&gt; Download the app, grant camera permissions, and start recording. That is it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All local storage.&lt;/strong&gt; Every recording stays on your device. Nothing is uploaded anywhere unless you explicitly choose to stream to YouTube.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No analytics.&lt;/strong&gt; No Firebase Analytics, no Crashlytics, no Mixpanel, no telemetry of any kind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote control via local network.&lt;/strong&gt; The embedded web server runs on your WiFi. Your control commands never leave your local network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube streaming is optional&lt;/strong&gt; and uses your own YouTube account — you control the content, the visibility settings, and the data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only network traffic the app generates is: (1) AdMob ads in the free version, and (2) YouTube RTMP data if you choose to stream. Neither involves uploading your recordings to any server.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trade-Offs
&lt;/h2&gt;

&lt;p&gt;Local-only recording does have limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No remote viewing by default.&lt;/strong&gt; You cannot check your camera from across town without setting up streaming or port forwarding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage management is on you.&lt;/strong&gt; Cloud services handle storage automatically. With local recording, you need to manage your own files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No AI features.&lt;/strong&gt; Person detection, package detection, and other smart features typically require cloud processing. Local-only means local-only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For many users, these trade-offs are worth making. Your footage stays yours, your costs stay zero, and your privacy stays intact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Background Camera RemoteStream is free on Google Play. Screen-off recording, local storage, no account required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.superfunicular.digicam" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt; | &lt;a href="https://superfunicular.com" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is your take on privacy vs. convenience in camera apps? Let me know in the comments.&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>android</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Embedding a Ktor Web Server Inside an Android App</title>
      <dc:creator>Super Funicular</dc:creator>
      <pubDate>Thu, 30 Apr 2026 07:52:33 +0000</pubDate>
      <link>https://dev.to/superfunicular/embedding-a-ktor-web-server-inside-an-android-app-2ica</link>
      <guid>https://dev.to/superfunicular/embedding-a-ktor-web-server-inside-an-android-app-2ica</guid>
      <description>&lt;h2&gt;
  
  
  Why Put a Web Server Inside a Phone?
&lt;/h2&gt;

&lt;p&gt;When I was building Background Camera RemoteStream — an Android app that records video with the screen off — I needed a way for users to control the camera remotely. The phone's screen is off, so you can't tap anything. The solution: embed a web server inside the app and let users control it from any browser on the same WiFi.&lt;/p&gt;

&lt;p&gt;This turned out to be one of the most interesting technical challenges in the whole project. Here's how it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing Ktor
&lt;/h2&gt;

&lt;p&gt;I evaluated several options for an embedded HTTP server on Android:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NanoHTTPD&lt;/strong&gt; — Lightweight and popular, but limited. No WebSocket support out of the box, no coroutine integration, and the API feels dated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ktor&lt;/strong&gt; — JetBrains' async HTTP framework. Full-featured, coroutine-native, WebSocket support, and works on Android.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spring Boot&lt;/strong&gt; — Way too heavy for an Android app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ktor won because it's Kotlin-native, supports coroutines (essential for Android), and has first-class WebSocket support for real-time updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Setup
&lt;/h2&gt;

&lt;p&gt;The server runs inside an Android foreground service alongside the camera. Here's the basic structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CameraService&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ApplicationEngine&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;startWebServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embeddedServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Netty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;WebSockets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ContentNegotiation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nf"&gt;routing&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nf"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"web"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="nf"&gt;defaultResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"web/index.html"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="nf"&gt;webSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/ws"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nf"&gt;handleWebSocketSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nf"&gt;cameraRoutes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                    &lt;span class="nf"&gt;recordingRoutes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                    &lt;span class="nf"&gt;streamingRoutes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;wait = false&lt;/code&gt; parameter is critical on Android — you don't want to block the service thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serving Static Files
&lt;/h2&gt;

&lt;p&gt;The web control interface is a single-page app bundled as static resources inside the APK. I put the HTML, CSS, and JavaScript files in &lt;code&gt;src/main/resources/web/&lt;/code&gt; and serve them with Ktor's static file routing.&lt;/p&gt;

&lt;p&gt;This means the entire remote control UI works offline — no internet required. Just connect to the phone's IP on your local network.&lt;/p&gt;

&lt;h2&gt;
  
  
  WebSocket for Real-Time Updates
&lt;/h2&gt;

&lt;p&gt;The remote control needs to show real-time status: is the camera recording? What's the current resolution? How much storage is left? Polling an HTTP endpoint would work but adds latency and unnecessary requests.&lt;/p&gt;

&lt;p&gt;WebSockets give us instant bidirectional communication:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;handleWebSocketSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;WebSocketSession&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Send initial state&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toJson&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;

    &lt;span class="c1"&gt;// Add to active sessions&lt;/span&gt;
    &lt;span class="n"&gt;activeSessions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;incoming&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nc"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readText&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                    &lt;span class="nf"&gt;executeCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;activeSessions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Broadcast state changes to all connected clients&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;broadcastState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;stateJson&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currentState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toJson&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;activeSessions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stateJson&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;activeSessions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whenever the camera state changes — recording starts, resolution changes, storage fills up — all connected browsers get an instant update.&lt;/p&gt;

&lt;h2&gt;
  
  
  REST API for Camera Control
&lt;/h2&gt;

&lt;p&gt;The REST endpoints handle commands like start/stop recording, switch cameras, and change settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cameraRoutes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/camera/start-recording"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;cameraController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startRecording&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatusCode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;StatusResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"recording"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/camera/stop-recording"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;cameraController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stopRecording&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatusCode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;StatusResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idle"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/camera/switch"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;cameraController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;switchCamera&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpStatusCode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;StatusResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"switched"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/camera/status"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cameraController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getStatus&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Android-Specific Challenges
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Port conflicts:&lt;/strong&gt; Other apps might be using port 8080. The app tries the configured port first, then falls back to alternatives (8081, 8082, etc.).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WiFi discovery:&lt;/strong&gt; Users need to know the phone's IP address. The app displays it in the notification and also supports mDNS/Bonjour so you can access it via a &lt;code&gt;.local&lt;/code&gt; hostname.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Battery impact:&lt;/strong&gt; Running a web server sounds expensive, but Ktor with Netty is event-driven. When no one's connected, it's essentially idle. The camera hardware draws far more power than the server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network permissions:&lt;/strong&gt; Android requires &lt;code&gt;ACCESS_WIFI_STATE&lt;/code&gt; and &lt;code&gt;INTERNET&lt;/code&gt; permissions. The server only binds to the local network interface — it's not accessible from the internet unless the user explicitly sets up port forwarding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lifecycle management:&lt;/strong&gt; The server must start and stop with the foreground service. If the service is killed by the OS (rare with a foreground service, but possible), the server goes down too. On restart, it rebinds to the same port.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Considerations
&lt;/h2&gt;

&lt;p&gt;Running an HTTP server on a phone raises security questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No authentication by default&lt;/strong&gt; — anyone on the same WiFi can access it. This is a deliberate trade-off for ease of use. Adding optional PIN protection is on the roadmap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP, not HTTPS&lt;/strong&gt; — local network traffic isn't encrypted. For a camera control interface on a home WiFi network, this is acceptable. For public networks, I'd recommend not using the remote control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Input validation&lt;/strong&gt; — all API inputs are validated and sanitized. The server only accepts known commands with expected parameter types.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Frontend
&lt;/h2&gt;

&lt;p&gt;The web UI is vanilla HTML/CSS/JavaScript — no React, no build tools, no npm. It needs to be small (bundled in the APK) and load instantly on any browser. The JavaScript connects via WebSocket on page load and updates the UI reactively as state changes come in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;The embedded Ktor server adds roughly 2MB to the APK size and negligible battery drain when idle. Users can control their camera from any device with a browser — laptop, tablet, another phone — without installing anything. The WebSocket connection means the control interface feels responsive and live.&lt;/p&gt;

&lt;p&gt;This architecture pattern — embedding a web server in a mobile app for local control — works well for any app that needs a secondary control surface. IoT controllers, media players, home automation — anywhere you want browser-based access without a cloud dependency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ktor.io/docs/welcome.html" rel="noopener noreferrer"&gt;Ktor documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.superfunicular.digicam" rel="noopener noreferrer"&gt;Background Camera RemoteStream on Google Play&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://superfunicular.com" rel="noopener noreferrer"&gt;superfunicular.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy to answer questions about the implementation — drop a comment below.&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>ktor</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Stream to YouTube Live from Android with Your Screen Off</title>
      <dc:creator>Super Funicular</dc:creator>
      <pubDate>Thu, 30 Apr 2026 07:51:23 +0000</pubDate>
      <link>https://dev.to/superfunicular/how-to-stream-to-youtube-live-from-android-with-your-screen-off-134e</link>
      <guid>https://dev.to/superfunicular/how-to-stream-to-youtube-live-from-android-with-your-screen-off-134e</guid>
      <description>&lt;h2&gt;
  
  
  The Problem with Mobile YouTube Streaming
&lt;/h2&gt;

&lt;p&gt;If you've ever tried streaming to YouTube Live from your phone, you know the pain: your screen stays on the entire time, your phone overheats, and your battery is dead in under two hours. For IRL streamers, event coverage, or anyone wanting to stream for more than a quick session, this is a dealbreaker.&lt;/p&gt;

&lt;p&gt;Most streaming apps — including YouTube's own — require the screen to stay on. The display alone consumes 30-40% of your phone's total power draw. That's a massive waste when you're just pointing the camera at something and don't need to see the screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Screen-Off YouTube Streaming Is Now Possible
&lt;/h2&gt;

&lt;p&gt;I built an Android app called Background Camera RemoteStream that solves this. It connects to YouTube's RTMP servers and streams your camera feed while the screen is completely off.&lt;/p&gt;

&lt;p&gt;The result: roughly 3-4x longer streaming sessions on a single charge compared to screen-on streaming apps.&lt;/p&gt;

&lt;p&gt;Here's how it works under the hood:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Camera2 API + Foreground Service:&lt;/strong&gt; The app uses Android's Camera2 API running inside a foreground service with a wake lock. This keeps the camera hardware active even when the screen is off and the device would normally sleep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RTMP over the YouTube Data API:&lt;/strong&gt; The app authenticates with your YouTube account via OAuth, creates a live broadcast and stream using the YouTube Live Streaming API, then pushes the camera feed as an RTMP stream to YouTube's ingest servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remote Control via Embedded Web Server:&lt;/strong&gt; Since you can't see or touch your phone screen during a stream, the app runs an embedded Ktor web server. You open your phone's local IP address in any browser on the same WiFi network and get a full control panel — start/stop streaming, switch cameras, monitor stream health, all from your laptop or another device.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting It Up
&lt;/h2&gt;

&lt;p&gt;Getting started takes about five minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Background Camera RemoteStream from Google Play&lt;/li&gt;
&lt;li&gt;Sign in with your YouTube account (Pro feature)&lt;/li&gt;
&lt;li&gt;Create a broadcast title and set privacy (public, unlisted, or private)&lt;/li&gt;
&lt;li&gt;Tap "Go Live" and lock your phone&lt;/li&gt;
&lt;li&gt;Open the remote control URL in any browser to monitor your stream&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The app handles all the YouTube API complexity — creating the broadcast, binding the stream, transitioning to live, and cleaning up when you're done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;IRL Streaming:&lt;/strong&gt; Mount your phone somewhere and stream for hours without worrying about battery. Great for outdoor events, travel streams, or city walks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event Coverage:&lt;/strong&gt; Set up a phone to stream a concert, conference talk, or sports event. No need to hold it or keep checking the screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security/Monitoring:&lt;/strong&gt; Stream a live feed of your home to a private YouTube stream you can check from anywhere in the world. No subscription service needed — just your YouTube account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nature/Wildlife Cams:&lt;/strong&gt; Point a phone at a bird feeder, beehive, or scenic view and stream it live. Screen-off mode means the phone can run all day on a single charge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Battery Comparison
&lt;/h2&gt;

&lt;p&gt;Tested on a Pixel 7 (4,355 mAh battery), 720p stream:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Estimated Stream Duration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;YouTube app (screen on)&lt;/td&gt;
&lt;td&gt;~1.5 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-party streamer (screen on)&lt;/td&gt;
&lt;td&gt;~2 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background Camera RemoteStream (screen off)&lt;/td&gt;
&lt;td&gt;~5-6 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Screen off + plugged into power bank&lt;/td&gt;
&lt;td&gt;12+ hours&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The screen-off advantage is huge for streaming because you're already pushing data over the network (which uses significant power). Eliminating the display consumption on top of that makes a real difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Challenges
&lt;/h2&gt;

&lt;p&gt;Building screen-off YouTube streaming wasn't straightforward. A few things I had to solve:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Camera2 API quirks with screen off:&lt;/strong&gt; Some devices try to release the camera when the screen turns off. The foreground service + wake lock combination prevents this, but I had to handle edge cases for different manufacturers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RTMP frame timing:&lt;/strong&gt; Maintaining consistent frame delivery to YouTube's RTMP servers while the device is in a low-power state required careful buffer management. Dropped frames cause stream quality issues and can trigger YouTube to disconnect the stream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YouTube API quota management:&lt;/strong&gt; The YouTube Data API has daily quota limits. Creating broadcasts, checking stream status, and managing the lifecycle all consume quota. The app batches API calls and caches responses to stay well within limits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OAuth token refresh:&lt;/strong&gt; Long streams can outlast OAuth access tokens. The app handles automatic token refresh without interrupting the stream.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy and Data
&lt;/h2&gt;

&lt;p&gt;The app only accesses your YouTube account when you explicitly start a stream. Camera footage goes directly from your phone to YouTube's servers — nothing passes through any intermediary server. When you're recording locally (not streaming), nothing ever leaves your device.&lt;/p&gt;

&lt;p&gt;No analytics, no telemetry, no cloud accounts required for the basic recording features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;Background Camera RemoteStream is free on Google Play for local recording. YouTube Live streaming is a Pro feature ($9.99/year or $19.99 lifetime).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.superfunicular.digicam" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt; | &lt;a href="https://superfunicular.com" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have questions about the technical implementation, drop a comment — happy to share more about Camera2 API background recording, RTMP streaming from Android, or the embedded web server architecture.&lt;/p&gt;

</description>
      <category>android</category>
      <category>youtube</category>
      <category>streaming</category>
      <category>mobile</category>
    </item>
    <item>
      <title>How to Record Video in the Background on Android (2026)</title>
      <dc:creator>Super Funicular</dc:creator>
      <pubDate>Thu, 30 Apr 2026 07:41:20 +0000</pubDate>
      <link>https://dev.to/superfunicular/how-to-record-video-in-the-background-on-android-2026-3f3n</link>
      <guid>https://dev.to/superfunicular/how-to-record-video-in-the-background-on-android-2026-3f3n</guid>
      <description>&lt;h2&gt;
  
  
  Why Record Video in the Background?
&lt;/h2&gt;

&lt;p&gt;There are plenty of legitimate reasons you might want your Android phone to record video while the screen is off or while you're using other apps: monitoring your home while you're away, recording a lecture hands-free, capturing a long timelapse without draining your battery, or vlogging without staring at your phone screen the whole time.&lt;/p&gt;

&lt;p&gt;The problem is that most camera apps require the screen to stay on. That drains your battery in 2-3 hours and makes the phone unusable for anything else while recording. Background recording solves both problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 1: Use Android's Built-In Screen Recording (Limited)
&lt;/h2&gt;

&lt;p&gt;Android 11+ includes a native screen recorder, but it's designed for recording your screen — not your camera. It won't use the rear camera and it records everything happening on your display. Not what we want here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Not useful for actual camera recording.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 2: Use a Background Camera App
&lt;/h2&gt;

&lt;p&gt;Several apps on Google Play are specifically designed for background video recording. Here's what to look for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features to evaluate:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Screen-off recording&lt;/strong&gt; — Can it actually record with the display completely off? This is the biggest battery saver.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background operation&lt;/strong&gt; — Does it keep recording when you switch to other apps?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Battery efficiency&lt;/strong&gt; — How much battery does it consume per hour of recording?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage management&lt;/strong&gt; — Does it auto-stop when storage is low?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote access&lt;/strong&gt; — Can you monitor or control the recording from another device?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt; — Where does the video go? Is it uploaded anywhere?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Some options available on Google Play:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Background Camera RemoteStream&lt;/strong&gt; — Records with the screen completely off (10x battery life compared to screen-on recording). Includes remote web control from any browser on the same WiFi and YouTube Live streaming. Privacy-focused with all local storage. Free version for basic recording, Pro for streaming features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;IP Webcam&lt;/strong&gt; — Turns your phone into a network camera. Good for monitoring but primarily designed as a webcam, not a background recorder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Alfred Camera&lt;/strong&gt; — Designed as a security camera app. Requires cloud account and uploads footage to their servers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DroidCam&lt;/strong&gt; — Primarily designed to use your phone as a PC webcam. Not focused on standalone recording.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Method 3: Tasker + Camera2 API (Advanced)
&lt;/h2&gt;

&lt;p&gt;For power users, Tasker can automate camera recording with specific triggers. This requires significant setup and technical knowledge but offers maximum flexibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Highly customizable, can trigger recording based on events&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Complex setup, Camera2 API quirks, may not work reliably with screen off&lt;/p&gt;

&lt;h2&gt;
  
  
  Battery Optimization Tips for Background Recording
&lt;/h2&gt;

&lt;p&gt;Regardless of which method you use, these tips will extend your recording time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Turn off the screen&lt;/strong&gt; — The display is the single biggest battery drain. If your app supports screen-off recording, use it. The difference is dramatic: 2-3 hours with screen on vs. 10+ hours with screen off.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lower the resolution&lt;/strong&gt; — 720p uses significantly less power than 1080p. For monitoring or hands-free vlogging, 720p is often sufficient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Disable WiFi and Bluetooth&lt;/strong&gt; — Unless you need remote access or are streaming, turn off radios you aren't using.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use airplane mode&lt;/strong&gt; — If you're just recording locally, airplane mode eliminates all radio power draw.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Close other apps&lt;/strong&gt; — Background apps compete for CPU and RAM. Close everything you don't need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep the phone cool&lt;/strong&gt; — Heat increases battery consumption. Avoid direct sunlight and remove the case if recording for long periods.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set auto-stop limits&lt;/strong&gt; — Configure your recording app to stop at low battery (10-15%) to avoid completely draining the phone.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Comparing Battery Life Across Methods
&lt;/h2&gt;

&lt;p&gt;Here's a rough comparison based on a typical mid-range Android phone (4,000 mAh battery):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Screen State&lt;/th&gt;
&lt;th&gt;Estimated Recording Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default camera app&lt;/td&gt;
&lt;td&gt;Screen on&lt;/td&gt;
&lt;td&gt;2-3 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background app (screen on)&lt;/td&gt;
&lt;td&gt;Screen on, app in background&lt;/td&gt;
&lt;td&gt;3-4 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background app (screen off)&lt;/td&gt;
&lt;td&gt;Screen off&lt;/td&gt;
&lt;td&gt;8-12 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background app + airplane mode&lt;/td&gt;
&lt;td&gt;Screen off, no radios&lt;/td&gt;
&lt;td&gt;12-15 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The screen-off difference is the most significant single factor. If you're recording for more than an hour, screen-off capability should be your top priority when choosing an app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy Considerations
&lt;/h2&gt;

&lt;p&gt;When choosing a background recording app, pay attention to where your video data goes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local-only storage&lt;/strong&gt; is the most private option. Your recordings stay on your device and are never uploaded anywhere unless you explicitly choose to share them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud-based apps&lt;/strong&gt; upload your footage to their servers. Read the privacy policy carefully — some retain the right to analyze your video content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apps requiring accounts&lt;/strong&gt; can associate your recordings with your identity. Account-free apps offer better anonymity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For maximum privacy, choose an app that stores everything locally, doesn't require an account, and doesn't include analytics or telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;If you want to try background recording today:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download a background camera app from Google Play&lt;/li&gt;
&lt;li&gt;Grant camera, microphone, and storage permissions&lt;/li&gt;
&lt;li&gt;Start a test recording and lock your phone&lt;/li&gt;
&lt;li&gt;Check that recording continues with the screen off&lt;/li&gt;
&lt;li&gt;Review the video quality and battery consumption&lt;/li&gt;
&lt;li&gt;Adjust resolution and settings based on your needs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Background recording is one of those features that, once you have it, you wonder how you managed without it. Whether it's for security monitoring, hands-free vlogging, or just capturing long events without babysitting your phone, the battery savings alone make it worthwhile.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about background recording on Android? Drop a comment below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>camera</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Turn Your Old Android Phone Into a Free Security Camera (No Subscription Required)</title>
      <dc:creator>Super Funicular</dc:creator>
      <pubDate>Thu, 30 Apr 2026 07:21:12 +0000</pubDate>
      <link>https://dev.to/superfunicular/turn-your-old-android-phone-into-a-free-security-camera-no-subscription-required-1m70</link>
      <guid>https://dev.to/superfunicular/turn-your-old-android-phone-into-a-free-security-camera-no-subscription-required-1m70</guid>
      <description>&lt;h2&gt;
  
  
  You Already Own a Security Camera
&lt;/h2&gt;

&lt;p&gt;That old Android phone sitting in a drawer? It has a camera, WiFi connectivity, and a battery. With the right app, it becomes a fully functional security camera — and unlike Ring, Nest, or Arlo, there's no monthly subscription, no cloud storage fees, and no company watching your footage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;An old Android phone&lt;/strong&gt; (Android 5.0 or newer — most phones from 2015 onward qualify)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A charger&lt;/strong&gt; (you'll want the phone plugged in for continuous recording)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WiFi connection&lt;/strong&gt; (to access the camera remotely from another device)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A background camera app&lt;/strong&gt; that supports screen-off recording and remote access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. Total cost: $0 if you already have an old phone. Compare that to $100-500 for a dedicated security camera plus $3-10/month for cloud storage subscriptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Prepare the Old Phone
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Factory reset&lt;/strong&gt; the phone (optional but recommended for performance)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove the SIM card&lt;/strong&gt; — you don't need cellular service&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connect to your WiFi network&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disable unnecessary apps&lt;/strong&gt; — uninstall or disable anything you don't need to free up RAM and storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turn off auto-updates&lt;/strong&gt; to prevent interruptions during recording&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable Developer Options&lt;/strong&gt; and turn on "Stay awake while charging" (Settings &amp;gt; Developer Options &amp;gt; Stay awake)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Install a Background Camera App
&lt;/h3&gt;

&lt;p&gt;You need an app that can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Record with the screen off (critical for battery and burn-in prevention)&lt;/li&gt;
&lt;li&gt;Run continuously in the background&lt;/li&gt;
&lt;li&gt;Auto-stop at low storage&lt;/li&gt;
&lt;li&gt;Ideally: provide remote access from another device&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Background Camera RemoteStream&lt;/strong&gt; is purpose-built for this use case. The free version handles screen-off recording. The Pro version adds remote web control — you can view and control the camera from any browser on the same WiFi without installing anything on your viewing device.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Position the Phone
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mount it with a phone holder or tripod&lt;/strong&gt; — or lean it against something stable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Point it at the area you want to monitor&lt;/strong&gt; — doorway, window, driveway, baby's room&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plug in the charger&lt;/strong&gt; — for continuous operation you need constant power&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider the angle&lt;/strong&gt; — slightly above eye level pointing downward covers the most area&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Configure Recording Settings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resolution:&lt;/strong&gt; 720p is usually sufficient for security footage and saves storage space&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio:&lt;/strong&gt; Enable if you want sound, disable for video-only monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage location:&lt;/strong&gt; Use the phone's internal storage or an SD card&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-stop:&lt;/strong&gt; Set to stop recording at 10-15% battery (as a safety net if power is interrupted)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duration:&lt;/strong&gt; Set to unlimited for continuous recording, or use timed sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Set Up Remote Access
&lt;/h3&gt;

&lt;p&gt;If your app supports remote access (like Background Camera RemoteStream's web console), you can monitor the camera from any device on your network:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start the remote server in the app&lt;/li&gt;
&lt;li&gt;Note the IP address displayed (e.g., 192.168.1.105:8080)&lt;/li&gt;
&lt;li&gt;Open that address in any browser on your WiFi network&lt;/li&gt;
&lt;li&gt;You now have live monitoring and camera controls from your laptop, tablet, or main phone&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No apps need to be installed on the viewing device — it's all browser-based.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Start Recording
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Turn on screen-off recording&lt;/li&gt;
&lt;li&gt;Lock the phone&lt;/li&gt;
&lt;li&gt;The screen will turn off, but recording continues&lt;/li&gt;
&lt;li&gt;Check from your remote device that everything is working&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Advantages Over Dedicated Security Cameras
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Old Phone + App&lt;/th&gt;
&lt;th&gt;Dedicated Camera (Ring/Nest)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hardware cost&lt;/td&gt;
&lt;td&gt;$0 (already own it)&lt;/td&gt;
&lt;td&gt;$100-500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monthly fees&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$3-10/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud storage&lt;/td&gt;
&lt;td&gt;None needed (local)&lt;/td&gt;
&lt;td&gt;Required for most features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privacy&lt;/td&gt;
&lt;td&gt;Data stays on device&lt;/td&gt;
&lt;td&gt;Uploaded to company servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolution&lt;/td&gt;
&lt;td&gt;720p-1080p&lt;/td&gt;
&lt;td&gt;720p-4K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Night vision&lt;/td&gt;
&lt;td&gt;No (unless phone has IR)&lt;/td&gt;
&lt;td&gt;Yes (most models)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weather resistance&lt;/td&gt;
&lt;td&gt;No (indoor only)&lt;/td&gt;
&lt;td&gt;Yes (outdoor models)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;10 minutes&lt;/td&gt;
&lt;td&gt;15-30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The biggest wins are cost ($0 vs. hundreds of dollars plus ongoing fees) and privacy (your footage never leaves your device vs. being stored on Amazon or Google servers).&lt;/p&gt;

&lt;p&gt;The biggest limitations are no night vision (unless your phone has an IR blaster, which most don't) and no weather resistance (this is an indoor solution).&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips for Reliable 24/7 Operation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Always keep it plugged in.&lt;/strong&gt; Battery-powered operation is fine for a few hours, but for continuous monitoring, you need constant power.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use a phone with a removable battery if possible.&lt;/strong&gt; Phones can develop battery swelling after months of continuous charging. If the battery is removable, consider removing it entirely and running on AC power alone (some phones support this).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manage storage.&lt;/strong&gt; A 64GB phone recording at 720p can store roughly 40-60 hours of footage. Set up a routine to transfer and delete old recordings weekly, or use an app that auto-deletes oldest files when storage gets low.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep the phone cool.&lt;/strong&gt; Recording generates heat. Don't place it in direct sunlight or in an enclosed space. Good airflow extends the phone's lifespan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Restart weekly.&lt;/strong&gt; A weekly restart clears memory leaks and keeps the phone running smoothly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Secure your WiFi network.&lt;/strong&gt; If you're using remote access, anyone on your WiFi can potentially access the camera feed. Use a strong WiFi password and change the default camera password.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Privacy: Why Local Storage Matters
&lt;/h2&gt;

&lt;p&gt;Here's what happens with your footage on cloud-based security cameras: it gets uploaded to a company's servers, where it's stored, potentially analyzed by AI, and accessible to the company's employees (and, in some cases, law enforcement without your knowledge).&lt;/p&gt;

&lt;p&gt;With a local-only setup, your footage never leaves your device. There's no company analyzing your home videos, no subscription you're paying for the privilege, and no risk of a cloud data breach exposing your private recordings.&lt;/p&gt;

&lt;p&gt;If privacy matters to you — and it should — local storage is the only approach that keeps you fully in control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You don't need to spend hundreds of dollars and commit to monthly subscriptions to monitor your home. An old Android phone, a free app, and 10 minutes of setup give you a functional security camera with better privacy than most commercial options.&lt;/p&gt;

&lt;p&gt;The only investment is a phone you already own and the time to set it up. Give it a try before buying a dedicated camera — you might find it's all you need.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions about setting up your DIY security camera? Leave a comment and I'll help troubleshoot.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>security</category>
      <category>diy</category>
      <category>privacy</category>
    </item>
    <item>
      <title>How to Record Video in the Background on Android (2026)</title>
      <dc:creator>Super Funicular</dc:creator>
      <pubDate>Thu, 30 Apr 2026 07:17:10 +0000</pubDate>
      <link>https://dev.to/superfunicular/how-to-record-video-in-the-background-on-android-2026-2o36</link>
      <guid>https://dev.to/superfunicular/how-to-record-video-in-the-background-on-android-2026-2o36</guid>
      <description>&lt;h2&gt;
  
  
  Why Record Video in the Background?
&lt;/h2&gt;

&lt;p&gt;There are plenty of legitimate reasons you might want your Android phone to record video while the screen is off or while you're using other apps: monitoring your home while you're away, recording a lecture hands-free, capturing a long timelapse without draining your battery, or vlogging without staring at your phone screen the whole time.&lt;/p&gt;

&lt;p&gt;The problem is that most camera apps require the screen to stay on. That drains your battery in 2-3 hours and makes the phone unusable for anything else while recording. Background recording solves both problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 1: Use Android's Built-In Screen Recording (Limited)
&lt;/h2&gt;

&lt;p&gt;Android 11+ includes a native screen recorder, but it's designed for recording your screen — not your camera. It won't use the rear camera and it records everything happening on your display. Not what we want here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; Not useful for actual camera recording.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 2: Use a Background Camera App
&lt;/h2&gt;

&lt;p&gt;Several apps on Google Play are specifically designed for background video recording. Here's what to look for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features to evaluate:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Screen-off recording&lt;/strong&gt; — Can it actually record with the display completely off? This is the biggest battery saver.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background operation&lt;/strong&gt; — Does it keep recording when you switch to other apps?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Battery efficiency&lt;/strong&gt; — How much battery does it consume per hour of recording?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage management&lt;/strong&gt; — Does it auto-stop when storage is low?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote access&lt;/strong&gt; — Can you monitor or control the recording from another device?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt; — Where does the video go? Is it uploaded anywhere?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Some options available on Google Play:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Background Camera RemoteStream&lt;/strong&gt; — Records with the screen completely off (10x battery life compared to screen-on recording). Includes remote web control from any browser on the same WiFi and YouTube Live streaming. Privacy-focused with all local storage. Free version for basic recording, Pro for streaming features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;IP Webcam&lt;/strong&gt; — Turns your phone into a network camera. Good for monitoring but primarily designed as a webcam, not a background recorder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Alfred Camera&lt;/strong&gt; — Designed as a security camera app. Requires cloud account and uploads footage to their servers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DroidCam&lt;/strong&gt; — Primarily designed to use your phone as a PC webcam. Not focused on standalone recording.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Method 3: Tasker + Camera2 API (Advanced)
&lt;/h2&gt;

&lt;p&gt;For power users, Tasker can automate camera recording with specific triggers. This requires significant setup and technical knowledge but offers maximum flexibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; Highly customizable, can trigger recording based on events&lt;br&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; Complex setup, Camera2 API quirks, may not work reliably with screen off&lt;/p&gt;

&lt;h2&gt;
  
  
  Battery Optimization Tips for Background Recording
&lt;/h2&gt;

&lt;p&gt;Regardless of which method you use, these tips will extend your recording time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Turn off the screen&lt;/strong&gt; — The display is the single biggest battery drain. If your app supports screen-off recording, use it. The difference is dramatic: 2-3 hours with screen on vs. 10+ hours with screen off.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lower the resolution&lt;/strong&gt; — 720p uses significantly less power than 1080p. For monitoring or hands-free vlogging, 720p is often sufficient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Disable WiFi and Bluetooth&lt;/strong&gt; — Unless you need remote access or are streaming, turn off radios you aren't using.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use airplane mode&lt;/strong&gt; — If you're just recording locally, airplane mode eliminates all radio power draw.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Close other apps&lt;/strong&gt; — Background apps compete for CPU and RAM. Close everything you don't need.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep the phone cool&lt;/strong&gt; — Heat increases battery consumption. Avoid direct sunlight and remove the case if recording for long periods.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set auto-stop limits&lt;/strong&gt; — Configure your recording app to stop at low battery (10-15%) to avoid completely draining the phone.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Comparing Battery Life Across Methods
&lt;/h2&gt;

&lt;p&gt;Here's a rough comparison based on a typical mid-range Android phone (4,000 mAh battery):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Screen State&lt;/th&gt;
&lt;th&gt;Estimated Recording Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default camera app&lt;/td&gt;
&lt;td&gt;Screen on&lt;/td&gt;
&lt;td&gt;2-3 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background app (screen on)&lt;/td&gt;
&lt;td&gt;Screen on, app in background&lt;/td&gt;
&lt;td&gt;3-4 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background app (screen off)&lt;/td&gt;
&lt;td&gt;Screen off&lt;/td&gt;
&lt;td&gt;8-12 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background app + airplane mode&lt;/td&gt;
&lt;td&gt;Screen off, no radios&lt;/td&gt;
&lt;td&gt;12-15 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The screen-off difference is the most significant single factor. If you're recording for more than an hour, screen-off capability should be your top priority when choosing an app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy Considerations
&lt;/h2&gt;

&lt;p&gt;When choosing a background recording app, pay attention to where your video data goes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local-only storage&lt;/strong&gt; is the most private option. Your recordings stay on your device and are never uploaded anywhere unless you explicitly choose to share them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud-based apps&lt;/strong&gt; upload your footage to their servers. Read the privacy policy carefully — some retain the right to analyze your video content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apps requiring accounts&lt;/strong&gt; can associate your recordings with your identity. Account-free apps offer better anonymity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For maximum privacy, choose an app that stores everything locally, doesn't require an account, and doesn't include analytics or telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;If you want to try background recording today:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download a background camera app from Google Play&lt;/li&gt;
&lt;li&gt;Grant camera, microphone, and storage permissions&lt;/li&gt;
&lt;li&gt;Start a test recording and lock your phone&lt;/li&gt;
&lt;li&gt;Check that recording continues with the screen off&lt;/li&gt;
&lt;li&gt;Review the video quality and battery consumption&lt;/li&gt;
&lt;li&gt;Adjust resolution and settings based on your needs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Background recording is one of those features that, once you have it, you wonder how you managed without it. Whether it's for security monitoring, hands-free vlogging, or just capturing long events without babysitting your phone, the battery savings alone make it worthwhile.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about background recording on Android? Drop a comment below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>camera</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Built a Production Android App in 75+ AI Sessions</title>
      <dc:creator>Super Funicular</dc:creator>
      <pubDate>Thu, 30 Apr 2026 07:15:04 +0000</pubDate>
      <link>https://dev.to/superfunicular/how-i-built-a-production-android-app-in-75-ai-sessions-54i5</link>
      <guid>https://dev.to/superfunicular/how-i-built-a-production-android-app-in-75-ai-sessions-54i5</guid>
      <description>&lt;h2&gt;
  
  
  The Experiment
&lt;/h2&gt;

&lt;p&gt;What happens when a solo developer tries to build a production Android app using AI as the primary coder?&lt;/p&gt;

&lt;p&gt;I've been building Background Camera RemoteStream — an Android app that records video in the background with the screen off and streams to YouTube Live — using Claude Code (Anthropic's AI coding tool) for over 75 sessions spanning 6+ months.&lt;/p&gt;

&lt;p&gt;The app is now live on Google Play. Here's what that journey looked like.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the App Does
&lt;/h2&gt;

&lt;p&gt;Background Camera RemoteStream solves a simple problem: recording video without destroying your battery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screen-off recording:&lt;/strong&gt; The screen turns completely off while recording, giving you roughly 10x battery life compared to traditional camera apps that keep the display on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remote control:&lt;/strong&gt; Control your phone's camera from any browser on the same WiFi network. No app needed on the viewing device — just open the IP address shown in the app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YouTube streaming:&lt;/strong&gt; Stream live to YouTube — even with the screen off. This is, as far as I can tell, the first app to offer screen-off YouTube streaming.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Development Journey
&lt;/h2&gt;

&lt;p&gt;Every line of code was written through conversation with Claude Code. The numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;75+ development sessions&lt;/strong&gt; over 6 months&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;204 builds&lt;/strong&gt; from first prototype to production release&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camera2 API&lt;/strong&gt;: Low-level Android camera control (one of Android's most complex APIs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedded Ktor web server&lt;/strong&gt;: A full HTTP/WebSocket server running inside an Android app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube Live integration&lt;/strong&gt;: RTMP streaming, OAuth, live chat — all built through AI pair programming&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Technical Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Background recording without a visible preview
&lt;/h3&gt;

&lt;p&gt;Android's Camera2 API normally requires a preview surface. We use a hidden SurfaceView technique to work around this, allowing the camera to record without anything visible on screen.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Screen-off operation
&lt;/h3&gt;

&lt;p&gt;Foreground services with wake locks keep the camera and embedded web server running when the screen is off. Getting this reliable across different Android versions and manufacturers was one of the longest debugging efforts.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Portrait video streaming
&lt;/h3&gt;

&lt;p&gt;YouTube's RTMP endpoint doesn't auto-rotate, so portrait video requires precise FFmpeg flag configuration to avoid sideways streams.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Embedded web server
&lt;/h3&gt;

&lt;p&gt;A full Ktor CIO server running on port 8080 inside an Android app, with WebSocket real-time updates for camera status, recording state, and stream health.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned About AI-Assisted Development
&lt;/h2&gt;

&lt;p&gt;The experience was genuinely different from traditional development. Some observations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI excels at boilerplate and API integration.&lt;/strong&gt; Setting up Camera2, configuring Ktor routes, wiring up YouTube OAuth — these are well-documented patterns that AI handles efficiently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI struggles with cross-cutting concerns.&lt;/strong&gt; When a change in the streaming module affected the recording module, which affected the UI state, AI needed very explicit guidance about the ripple effects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The conversation history is your architecture document.&lt;/strong&gt; 75 sessions of back-and-forth with Claude Code created an implicit design document. If I ever need to onboard someone, those transcripts contain every decision and its rationale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You still need to understand the domain.&lt;/strong&gt; AI wrote the code, but I needed to understand enough about Camera2, RTMP, and Android services to evaluate whether the code was correct. Pure delegation doesn't work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;The app is live on Google Play with zero crashes and zero ANRs. Built by someone who isn't a professional Android developer, using AI as the coding engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://play.google.com/store/apps/details?id=com.superfunicular.digicam" rel="noopener noreferrer"&gt;Background Camera RemoteStream on Google Play&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://superfunicular.com/backgroundcameraremotestream/" rel="noopener noreferrer"&gt;superfunicular.com/backgroundcameraremotestream&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;What's your experience with AI-assisted development? Have you built something with Claude Code, Cursor, or similar tools? I'd love to hear about it in the comments.&lt;/p&gt;

</description>
      <category>android</category>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>indiehacker</category>
    </item>
    <item>
      <title>How I Built a Production Android App in 7000+ AI Sessions</title>
      <dc:creator>Super Funicular</dc:creator>
      <pubDate>Thu, 30 Apr 2026 03:57:48 +0000</pubDate>
      <link>https://dev.to/superfunicular/how-i-built-a-production-android-app-in-75-ai-sessions-1a62</link>
      <guid>https://dev.to/superfunicular/how-i-built-a-production-android-app-in-75-ai-sessions-1a62</guid>
      <description>&lt;h2&gt;
  
  
  The Experiment
&lt;/h2&gt;

&lt;p&gt;What happens when a solo developer tries to build a production Android app using AI as the primary coder?&lt;/p&gt;

&lt;p&gt;I've been building Background Camera RemoteStream — an Android app that records video in the background with the screen off and streams to YouTube Live — using Claude Code (Anthropic's AI coding tool) for over 7000 sessions spanning 6+ months.&lt;/p&gt;

&lt;p&gt;The app is now live on Google Play. Here's what that journey looked like.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the App Does
&lt;/h2&gt;

&lt;p&gt;Background Camera RemoteStream solves a simple problem: recording video without destroying your battery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screen-off recording:&lt;/strong&gt; The screen turns completely off while recording, giving you roughly 10x battery life compared to traditional camera apps that keep the display on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remote control:&lt;/strong&gt; Control your phone's camera from any browser on the same WiFi network. No app needed on the viewing device — just open the IP address shown in the app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YouTube streaming:&lt;/strong&gt; Stream live to YouTube — even with the screen off. This is, as far as I can tell, the first app to offer screen-off YouTube streaming.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Development Journey
&lt;/h2&gt;

&lt;p&gt;Every line of code was written through conversation with Claude Code. The numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;75+ development sessions&lt;/strong&gt; over 6 months&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;204 builds&lt;/strong&gt; from first prototype to production release&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camera2 API&lt;/strong&gt;: Low-level Android camera control (one of Android's most complex APIs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedded Ktor web server&lt;/strong&gt;: A full HTTP/WebSocket server running inside an Android app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube Live integration&lt;/strong&gt;: RTMP streaming, OAuth, live chat — all built through AI pair programming&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Key Technical Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Background recording without a visible preview
&lt;/h3&gt;

&lt;p&gt;Android's Camera2 API normally requires a preview surface. We use a hidden SurfaceView technique to work around this, allowing the camera to record without anything visible on screen.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Screen-off operation
&lt;/h3&gt;

&lt;p&gt;Foreground services with wake locks keep the camera and embedded web server running when the screen is off. Getting this reliable across different Android versions and manufacturers was one of the longest debugging efforts.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Portrait video streaming
&lt;/h3&gt;

&lt;p&gt;YouTube's RTMP endpoint doesn't auto-rotate, so portrait video requires precise FFmpeg flag configuration to avoid sideways streams.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Embedded web server
&lt;/h3&gt;

&lt;p&gt;A full Ktor CIO server running on port 8080 inside an Android app, with WebSocket real-time updates for camera status, recording state, and stream health.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned About AI-Assisted Development
&lt;/h2&gt;

&lt;p&gt;The experience was genuinely different from traditional development. Some observations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI excels at boilerplate and API integration.&lt;/strong&gt; Setting up Camera2, configuring Ktor routes, wiring up YouTube OAuth — these are well-documented patterns that AI handles efficiently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI struggles with cross-cutting concerns.&lt;/strong&gt; When a change in the streaming module affected the recording module, which affected the UI state, AI needed very explicit guidance about the ripple effects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The conversation history is your architecture document.&lt;/strong&gt; 75 sessions of back-and-forth with Claude Code created an implicit design document. If I ever need to onboard someone, those transcripts contain every decision and its rationale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You still need to understand the domain.&lt;/strong&gt; AI wrote the code, but I needed to understand enough about Camera2, RTMP, and Android services to evaluate whether the code was correct. Pure delegation doesn't work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;The app is live on Google Play with zero crashes and zero ANRs. Built by someone who isn't a professional Android developer, using AI as the coding engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://play.google.com/store/apps/details?id=com.superfunicular.digicam" rel="noopener noreferrer"&gt;Background Camera RemoteStream on Google Play&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://superfunicular.com/backgroundcameraremotestream/" rel="noopener noreferrer"&gt;superfunicular.com/backgroundcameraremotestream&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;What's your experience with AI-assisted development? Have you built something with Claude Code, Cursor, or similar tools? I'd love to hear about it in the comments.&lt;/p&gt;

</description>
      <category>android</category>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>indiehacker</category>
    </item>
  </channel>
</rss>
