<?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: mogee</title>
    <description>The latest articles on DEV Community by mogee (@mogee).</description>
    <link>https://dev.to/mogee</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%2F3754074%2F94cca482-964e-4bb0-a0ba-5041fc644b94.png</url>
      <title>DEV Community: mogee</title>
      <link>https://dev.to/mogee</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mogee"/>
    <language>en</language>
    <item>
      <title>My App Got Rejected for "Device Automation" on Google Play — Here's What I Had to Do</title>
      <dc:creator>mogee</dc:creator>
      <pubDate>Tue, 24 Mar 2026 13:12:52 +0000</pubDate>
      <link>https://dev.to/mogee/my-app-got-rejected-for-device-automation-on-google-play-heres-what-i-had-to-do-4b2i</link>
      <guid>https://dev.to/mogee/my-app-got-rejected-for-device-automation-on-google-play-heres-what-i-had-to-do-4b2i</guid>
      <description>&lt;p&gt;I built a small Android app called &lt;strong&gt;ALL SMS&lt;/strong&gt; — it automatically forwards incoming SMS messages to a phone number, email, or webhook. Simple concept, clear use case. Then Google Play rejected it.&lt;/p&gt;

&lt;p&gt;The rejection email cited the &lt;strong&gt;Device Automation policy&lt;/strong&gt;, but the explanation was vague enough that I genuinely had no idea what was missing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Google Play's Device Automation Policy?
&lt;/h2&gt;

&lt;p&gt;The policy applies when your app performs automated actions on the device without direct user input — things like forwarding SMS, sending emails, triggering webhooks, or saving files automatically.&lt;/p&gt;

&lt;p&gt;Google's stance: &lt;em&gt;"You must clearly describe every automated action your app performs, and users must be aware of and consent to it."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Fair enough. But my app already had an SMS forwarding feature front and center. So what was wrong?&lt;/p&gt;




&lt;h2&gt;
  
  
  I Went Straight to Google
&lt;/h2&gt;

&lt;p&gt;Instead of guessing, I submitted a support inquiry through the Play Console. After some back and forth (with help from a specialist), I got the real answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;To qualify as a Device Automation app, your app must include at least 4 OS-level automation actions.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This isn't clearly stated in the public docs — at least not that I could find. But that was the benchmark. My app technically had automated features, but one was partially hidden in the UI and the implementation wasn't complete enough to count. I was sitting at 3.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built to Fix It
&lt;/h2&gt;

&lt;p&gt;I went back and made sure &lt;strong&gt;4 clear, working automation actions&lt;/strong&gt; were front and center in the app:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Forward SMS to a phone number&lt;/strong&gt; — the core feature, always worked&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forward SMS to email&lt;/strong&gt; — via SMTP or Gmail OAuth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send SMS to a webhook (HTTP POST)&lt;/strong&gt; — great for Slack, Zapier, custom servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-save SMS to CSV&lt;/strong&gt; &lt;em&gt;(newly added)&lt;/em&gt; — with a built-in in-app CSV viewer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each one visible, documented, and clearly explained in the UI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;If you're building an app that touches device automation on Android:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You need at least 4 OS-level automation actions&lt;/strong&gt; — this was confirmed by Google support, not public docs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every automated action must be clearly visible&lt;/strong&gt; in your UI, not buried in settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your demo video matters&lt;/strong&gt; — show each automation actually running&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If the rejection reason is vague, ask Google directly&lt;/strong&gt; via Play Console support. It's the fastest way to get real criteria&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rejection was frustrating, but it pushed me to build a better app. The CSV feature I added is now one of the more useful parts of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try ALL SMS
&lt;/h2&gt;

&lt;p&gt;If you're looking for a simple, no-frills SMS forwarder for Android:&lt;br&gt;
👉 &lt;a href="https://play.google.com/store/apps/details?id=com.smsforwarder.app" rel="noopener noreferrer"&gt;Play Store — ALL SMS&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>googleplay</category>
      <category>flutter</category>
      <category>devjourney</category>
    </item>
    <item>
      <title>I Built an Open-Source Bridge That Turns Claude Code Into a REST API</title>
      <dc:creator>mogee</dc:creator>
      <pubDate>Mon, 23 Mar 2026 03:50:40 +0000</pubDate>
      <link>https://dev.to/mogee/i-built-an-open-source-bridge-that-turns-claude-code-into-a-rest-api-16d2</link>
      <guid>https://dev.to/mogee/i-built-an-open-source-bridge-that-turns-claude-code-into-a-rest-api-16d2</guid>
      <description>&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;If you're already paying for Claude Code (Max plan), you have access to an incredibly powerful AI right in your terminal. I wanted to &lt;strong&gt;get more out of that subscription&lt;/strong&gt; — use it from my web apps, Slack bots, CI pipelines, and Python scripts running on other machines.&lt;/p&gt;

&lt;p&gt;Anthropic does have an official API, but it's pay-per-token — a separate cost. Since I'm already paying for a subscription, I figured: why not use what I've got?&lt;/p&gt;

&lt;p&gt;There are some great open-source wrappers like &lt;a href="https://github.com/coder/agentapi" rel="noopener noreferrer"&gt;coder/agentapi&lt;/a&gt; and &lt;a href="https://github.com/codingworkflow/claude-code-api" rel="noopener noreferrer"&gt;claude-code-api&lt;/a&gt;, but they're designed for local use only. I needed something that works &lt;strong&gt;remotely&lt;/strong&gt; too — without having to set up reverse proxies, TLS certificates, and authentication from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/smy383/claude-api-bridge" rel="noopener noreferrer"&gt;claude-api-bridge&lt;/a&gt;&lt;/strong&gt; lets you use your existing Claude Code subscription as a REST API, accessible from anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One command. That's it.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx claude-api-bridge start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;✅  Claude Code CLI detected
🚀  API server running on http://localhost:3456
🔑  Admin Token: cab-a1b2c3d4e5f6...
🌐  Public URL: https://random-words.trycloudflare.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have a &lt;strong&gt;real HTTPS endpoint&lt;/strong&gt; that you can call from any app, anywhere in the world.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your App (anywhere on the internet)
    │
    │ HTTPS
    ▼
Cloudflare Tunnel (automatic SSL, zero config)
    │
    ▼
claude-api-bridge (your desktop)
    ├─ Token Authentication (SHA256)
    ├─ Request Queue
    └─ Claude Code CLI (your subscription)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your desktop becomes the API server. Claude Code runs locally using your existing subscription. Cloudflare Tunnel handles the networking — no port forwarding, no ngrok, no reverse proxy setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&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;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🚀 &lt;strong&gt;One-command setup&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;No config files, no environment variables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🌐 &lt;strong&gt;Remote access&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Cloudflare Tunnel with automatic HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔑 &lt;strong&gt;Token management&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Create, revoke, expire. SHA256 hashed — never stored in plaintext&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💬 &lt;strong&gt;Session modes&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Stateless (fresh each time) or Stateful (conversation memory)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📊 &lt;strong&gt;Web dashboard&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Monitor at &lt;code&gt;/dashboard&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔒 &lt;strong&gt;Secure&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Rate limiting, CSP headers, execution timeout, output size limits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💾 &lt;strong&gt;Zero dependencies&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;SQLite for storage — no Redis, no Postgres&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Quick Example
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://your-url.trycloudflare.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cab-your-token&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;TOKEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/api/ask&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;rid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;requestId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/api/ask/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;H&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a function to check if a number is prime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  JavaScript
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;askClaude&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/ask`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;requestId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&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="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;poll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/ask/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;requestId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;poll&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;completed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&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;
  
  
  How It Compares
&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;claude-api-bridge&lt;/th&gt;
&lt;th&gt;coder/agentapi&lt;/th&gt;
&lt;th&gt;claude-code-api&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Remote access (HTTPS)&lt;/td&gt;
&lt;td&gt;✅ Built-in&lt;/td&gt;
&lt;td&gt;❌ Local only&lt;/td&gt;
&lt;td&gt;❌ Local only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token management&lt;/td&gt;
&lt;td&gt;✅ Full CRUD&lt;/td&gt;
&lt;td&gt;❌ None&lt;/td&gt;
&lt;td&gt;⚠️ Static keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token security&lt;/td&gt;
&lt;td&gt;✅ SHA256 hash&lt;/td&gt;
&lt;td&gt;❌ N/A&lt;/td&gt;
&lt;td&gt;❌ Plaintext&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session persistence&lt;/td&gt;
&lt;td&gt;✅ SQLite&lt;/td&gt;
&lt;td&gt;❌ In-memory&lt;/td&gt;
&lt;td&gt;⚠️ In-memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crash recovery&lt;/td&gt;
&lt;td&gt;✅ Auto&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero config&lt;/td&gt;
&lt;td&gt;✅ One command&lt;/td&gt;
&lt;td&gt;✅ One command&lt;/td&gt;
&lt;td&gt;⚠️ Config needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Limitations (Being Honest)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your desktop must be running&lt;/strong&gt; — Claude CLI executes on your machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One request at a time&lt;/strong&gt; — Claude CLI is single-threaded, requests are queued&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free tunnel URL changes on restart&lt;/strong&gt; — use a Cloudflare account for a fixed domain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response time varies&lt;/strong&gt; — typically 10 seconds to 2 minutes depending on the task&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx claude-api-bridge start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/smy383/claude-api-bridge" rel="noopener noreferrer"&gt;github.com/smy383/claude-api-bridge&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;npm&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/claude-api-bridge" rel="noopener noreferrer"&gt;npmjs.com/package/claude-api-bridge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Star ⭐ if you find it useful!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by the team behind &lt;a href="https://ttapp-remote.com" rel="noopener noreferrer"&gt;ttapp&lt;/a&gt; — the mobile remote for Claude Code.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>api</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I built a community where your AI assistant is the only interface</title>
      <dc:creator>mogee</dc:creator>
      <pubDate>Sat, 21 Mar 2026 02:51:58 +0000</pubDate>
      <link>https://dev.to/mogee/i-built-a-community-where-your-ai-assistant-is-the-only-interface-2577</link>
      <guid>https://dev.to/mogee/i-built-a-community-where-your-ai-assistant-is-the-only-interface-2577</guid>
      <description>&lt;p&gt;Most developer communities are built for humans.&lt;/p&gt;

&lt;p&gt;Obvious, right? But think about what that actually means: a browser, a UI, a login page, buttons to click. Everything optimized for &lt;strong&gt;human eyes and fingers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I took a different approach with &lt;strong&gt;Maxpace&lt;/strong&gt;: a developer community where &lt;strong&gt;your AI assistant is the interface&lt;/strong&gt;. No web frontend. No mobile app. No dashboard to log into.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Maxpace exposes a &lt;strong&gt;remote MCP server&lt;/strong&gt;. You connect your AI (Claude, or any MCP-compatible agent) to it with a single URL, and then just... talk.&lt;/p&gt;

&lt;p&gt;Want to post something? Ask your AI. Want to search for discussions about a specific topic? Ask your AI. React, comment, join a meetup — all through your AI assistant.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add maxpace &lt;span class="nt"&gt;--transport&lt;/span&gt; http https://[region]-[project].cloudfunctions.net/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the entire setup. The AI becomes your community client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why no UI?
&lt;/h2&gt;

&lt;p&gt;I kept asking myself: &lt;em&gt;if AI assistants already read my PRs, write my docs, and manage my tasks — why aren't they participating in the communities I care about?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Developer communities are where knowledge lives. But getting that knowledge into your AI's context meant copy-pasting, screenshotting, link-sharing. It felt backwards.&lt;/p&gt;

&lt;p&gt;So I flipped it: &lt;strong&gt;design the community for AI-mediated access from day one.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Authentication — no passwords, no browser
&lt;/h2&gt;

&lt;p&gt;When you register via MCP, you get a token back in the response. That's it.&lt;/p&gt;

&lt;p&gt;No email verification flow, no OAuth dance, no redirect URIs. The token is also sent to your email as a backup. Web-redirect-based auth requires a browser — Maxpace doesn't have one, so this approach felt natural.&lt;/p&gt;

&lt;h2&gt;
  
  
  Semantic search, not keyword matching
&lt;/h2&gt;

&lt;p&gt;Every post gets an embedding on write. Search finds what you &lt;em&gt;mean&lt;/em&gt;, not just what you typed.&lt;/p&gt;

&lt;p&gt;Search for &lt;em&gt;"handling async errors gracefully"&lt;/em&gt; and you'll find posts that never used those exact words. This works especially well in an AI-native environment where the search query itself is often generated by the AI from your natural language.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it feels like
&lt;/h2&gt;

&lt;p&gt;I use Claude Code daily via a mobile remote I built. So I interact with Maxpace the same way — from my phone, through Claude:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[me] → "Post something about stateless API design"
[Claude] → calls node_write tool
[Maxpace] → stores, embeds, returns post
[Claude] → "Posted! 3 people already bookmarked a similar post..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The community lives &lt;em&gt;inside&lt;/em&gt; my AI workflow, not outside it. That's the shift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Maxpace MCP is public. The README has everything you need to connect:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/smy383/maxpace-mcp" rel="noopener noreferrer"&gt;github.com/smy383/maxpace-mcp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Curious whether this resonates with other developers — or whether this is a solution looking for a problem. Drop a comment either way. 👇&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>community</category>
      <category>claudeai</category>
    </item>
    <item>
      <title>I built a mobile remote for Claude Code — here's how</title>
      <dc:creator>mogee</dc:creator>
      <pubDate>Sun, 01 Mar 2026 01:43:03 +0000</pubDate>
      <link>https://dev.to/mogee/i-built-a-mobile-remote-for-claude-code-heres-how-31od</link>
      <guid>https://dev.to/mogee/i-built-a-mobile-remote-for-claude-code-heres-how-31od</guid>
      <description>&lt;p&gt;If you've used Claude Code, you know how powerful it is.&lt;/p&gt;

&lt;p&gt;But there's one problem — you're chained to your desk.&lt;/p&gt;

&lt;p&gt;What if you could send Claude Code commands from your phone, get real-time responses, and keep working from anywhere?&lt;/p&gt;

&lt;p&gt;That's exactly why I built &lt;strong&gt;ttapp&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I kept having ideas while commuting, lying in bed, or grabbing coffee. By the time I got back to my desk, the momentum was gone.&lt;/p&gt;

&lt;p&gt;Claude Code is incredible — but it lives on your desktop. And your desktop doesn't fit in your pocket.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ttapp Does
&lt;/h2&gt;

&lt;p&gt;ttapp connects your &lt;strong&gt;mobile phone&lt;/strong&gt; to your &lt;strong&gt;desktop Claude Code session&lt;/strong&gt; in real time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type a command on your phone&lt;/li&gt;
&lt;li&gt;Claude executes it on your desktop&lt;/li&gt;
&lt;li&gt;Results stream back to your mobile instantly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No VPN. No SSH. No complicated setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;The architecture is surprisingly simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mobile (Flutter) → Firestore → Desktop (Tauri)
                                     ↓
                               Claude Code CLI
                                     ↓
Mobile (Flutter) ← Firestore ← Results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Mobile writes a message to Firestore&lt;/li&gt;
&lt;li&gt;Desktop listener picks it up instantly&lt;/li&gt;
&lt;li&gt;Claude Code runs with &lt;code&gt;--resume&lt;/code&gt; for session continuity&lt;/li&gt;
&lt;li&gt;Results stream back to mobile in real time&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mobile&lt;/strong&gt;: Flutter (iOS + Android)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop&lt;/strong&gt;: Tauri v2 (macOS, Windows, Linux)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Firebase (Firestore + Cloud Functions)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bridge&lt;/strong&gt;: Claude Code CLI with session resume&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What You Can Do With It
&lt;/h2&gt;

&lt;p&gt;🔧 Fix bugs while commuting&lt;br&gt;
📱 Review code from your couch&lt;br&gt;
🌙 Send a quick command at midnight&lt;br&gt;
☕ Check build status over coffee&lt;/p&gt;

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

&lt;p&gt;ttapp is &lt;strong&gt;free to start&lt;/strong&gt; — no credit card needed.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://ttapp-remote.com" rel="noopener noreferrer"&gt;ttapp-remote.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Available on iOS, Android, macOS, Windows, and Linux.&lt;/p&gt;




&lt;p&gt;Would love to hear your thoughts — what would you add to a tool like this? 👇&lt;/p&gt;

</description>
      <category>claudeai</category>
      <category>flutter</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>I Built a "Give &amp; Take" Feedback App Because Nobody Was Reviewing My Side Projects</title>
      <dc:creator>mogee</dc:creator>
      <pubDate>Thu, 05 Feb 2026 04:08:48 +0000</pubDate>
      <link>https://dev.to/mogee/i-built-a-give-take-feedback-app-because-nobody-was-reviewing-my-side-projects-22f7</link>
      <guid>https://dev.to/mogee/i-built-a-give-take-feedback-app-because-nobody-was-reviewing-my-side-projects-22f7</guid>
      <description>&lt;h2&gt;
  
  
  The Frustrating Reality of Indie Development
&lt;/h2&gt;

&lt;p&gt;I've shipped a few apps as a solo developer. Getting downloads? Possible with&lt;br&gt;
  some marketing. But getting &lt;em&gt;real, actionable feedback&lt;/em&gt;? Nearly impossible.&lt;/p&gt;

&lt;p&gt;App store reviews are mostly "great app" or "doesn't work" - nothing in&lt;br&gt;
  between. I tried posting on Reddit, Twitter, and Discord communities.&lt;br&gt;
  Sometimes I got lucky, but most responses were just polite encouragement, not&lt;br&gt;
  the honest critique I needed.&lt;/p&gt;

&lt;p&gt;I realized other indie developers probably felt the same way.&lt;/p&gt;

&lt;p&gt;## The Idea: What If Feedback Was a Trade?&lt;/p&gt;

&lt;p&gt;I thought about how feedback works in creative communities. Writers have beta&lt;br&gt;
  readers. Designers have critique circles. Why don't indie developers have&lt;br&gt;
  something similar?&lt;/p&gt;

&lt;p&gt;So I came up with a simple concept:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Give feedback → Get visibility&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The more detailed feedback you provide to others, the more your own app gets&lt;br&gt;
  promoted to the community. It's like a mutual aid system - everyone helps&lt;br&gt;
  everyone.&lt;/p&gt;

&lt;p&gt;I called it &lt;strong&gt;FeedApp&lt;/strong&gt; (품앗이 피드백 커뮤니티 in Korean, which roughly&lt;br&gt;
  translates to "mutual help feedback community").&lt;/p&gt;

&lt;p&gt;## How It Works&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Register your app/web/game&lt;/strong&gt; with screenshots and description&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browse other creators' projects&lt;/strong&gt; and leave detailed feedback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Earn visibility&lt;/strong&gt; - your project gets shown to people you helped&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receive feedback&lt;/strong&gt; from other creators who understand the struggle&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There's also a "feedback rate" system - if you don't reciprocate within 10&lt;br&gt;
  days, your rate drops. This keeps the community active and fair.&lt;/p&gt;

&lt;p&gt;## Tech Stack&lt;/p&gt;

&lt;p&gt;| Layer | Technology |&lt;br&gt;
  |-------|------------|&lt;br&gt;
  | Frontend | Flutter (iOS, Android, Web) |&lt;br&gt;
  | Backend | Firebase (Firestore, Cloud Functions) |&lt;br&gt;
  | Auth | Google, Apple, Kakao Sign-in |&lt;br&gt;
  | Push | Firebase Cloud Messaging |&lt;br&gt;
  | i18n | 4 languages (KO, EN, JA, ZH) |&lt;/p&gt;

&lt;p&gt;I chose Flutter because I wanted to ship on all platforms with one codebase.&lt;br&gt;
  Firebase made the backend simple enough for a solo developer to manage.&lt;/p&gt;

&lt;p&gt;## Challenges I Faced&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Preventing "low-effort" feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Early on, I worried people would just write "nice app" to game the system. I&lt;br&gt;
  added a 30-character minimum requirement, but the real solution was the&lt;br&gt;
  community itself - creators naturally want quality feedback, so they give&lt;br&gt;
  quality feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The "cold start" problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A feedback exchange only works if there are people to exchange with. I&lt;br&gt;
  initially seeded the platform with my own projects and invited developer&lt;br&gt;
  friends. It's still small, but growing organically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Cross-platform auth headaches&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Implementing Kakao login (popular in Korea) alongside Google and Apple across&lt;br&gt;
  iOS, Android, AND web was... painful. Each platform has its quirks.&lt;/p&gt;

&lt;p&gt;## What I Learned&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start with the smallest possible loop.&lt;/strong&gt; My MVP was just: register →
browse → feedback. Everything else came later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community moderation matters early.&lt;/strong&gt; Even with 50 users, you need clear
guidelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solo development is lonely.&lt;/strong&gt; Ironically, building an app about feedback
made me realize how much I needed feedback myself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;## Current Status&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;~100 registered services&lt;/li&gt;
&lt;li&gt;Web is live, mobile apps under review&lt;/li&gt;
&lt;li&gt;Still early, but the core loop is working&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;## Try It Out&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Web:&lt;/strong&gt; &lt;a href="https://feedapp-prod.web.app" rel="noopener noreferrer"&gt;feedapp-prod.web.app&lt;/a&gt; ← Live now!&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Android:&lt;/strong&gt; Under review (coming soon)&lt;/li&gt;
&lt;li&gt;🍎 &lt;strong&gt;iOS:&lt;/strong&gt; Under review (coming soon)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can register your service on web first - it'll sync when the mobile apps&lt;br&gt;
  launch!&lt;/p&gt;

&lt;p&gt;## I'd Love Your Feedback (Ironic, I Know)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this concept make sense?&lt;/li&gt;
&lt;li&gt;Would you use something like this?&lt;/li&gt;
&lt;li&gt;Any features you'd want to see?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a solo dev, every bit of feedback helps. Thanks for reading! 🙏&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're also an indie developer struggling to get feedback, let's connect.&lt;br&gt;
  Drop a comment or find me on the app!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>flutter</category>
      <category>firebase</category>
      <category>indiehackers</category>
    </item>
  </channel>
</rss>
