<?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: Grokkris</title>
    <description>The latest articles on DEV Community by Grokkris (@grokkris_267433fde5540f5b).</description>
    <link>https://dev.to/grokkris_267433fde5540f5b</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4117609%2Ff95ba8e0-0951-45bf-ad7b-5af2d4d9b2c5.png</url>
      <title>DEV Community: Grokkris</title>
      <link>https://dev.to/grokkris_267433fde5540f5b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/grokkris_267433fde5540f5b"/>
    <language>en</language>
    <item>
      <title>My Android AI app has 400 unit tests. None of them can tell me if the model's answer is any good</title>
      <dc:creator>Grokkris</dc:creator>
      <pubDate>Tue, 27 Oct 2026 17:45:23 +0000</pubDate>
      <link>https://dev.to/grokkris_267433fde5540f5b/my-android-ai-app-has-400-unit-tests-none-of-them-can-tell-me-if-the-models-answer-is-any-good-fp6</link>
      <guid>https://dev.to/grokkris_267433fde5540f5b/my-android-ai-app-has-400-unit-tests-none-of-them-can-tell-me-if-the-models-answer-is-any-good-fp6</guid>
      <description>&lt;p&gt;I'm a student building an open-source Android AI app on my own, and at some point I hit 400 unit tests with zero failures. That sounds great until you ask what those tests actually prove.&lt;/p&gt;

&lt;p&gt;Quick context: Kryzz AI is an MIT-licensed Android app (Kotlin + Jetpack Compose) for chat, voice and agent tasks. It doesn't run models on the phone. You bring your own OpenRouter key and the models are hosted by whichever provider you pick. Chats, memory, files and keys stay on the device, and there's no analytics or telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the tests are good at
&lt;/h2&gt;

&lt;p&gt;An AI app has a lot of plain, boring code around the model, and that's exactly where tests pay off. Looking at the test folder, most files fall into a few groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parsing what comes back.&lt;/strong&gt; Streaming responses (&lt;code&gt;SseParserTest&lt;/code&gt;), API responses, tool calls written as XML, and the agent's plan (&lt;code&gt;AgentPlanParserTest&lt;/code&gt;). Models return slightly broken output all the time, so the parser has to survive it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules the agent must follow.&lt;/strong&gt; Which links it's allowed to open (&lt;code&gt;FetchAllowlistTest&lt;/code&gt;), how many steps a turn can take (&lt;code&gt;AgentLoopPolicyTest&lt;/code&gt;, &lt;code&gt;AgentTurnPolicyTest&lt;/code&gt;), and what happens when the model sends back nothing at all (&lt;code&gt;EmptyResponsePolicyTest&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaning up before the user sees it.&lt;/strong&gt; Stripping leftover reasoning text (&lt;code&gt;ReasoningScrubTest&lt;/code&gt;), shrinking old context so a long chat still fits (&lt;code&gt;ContextCompactorTest&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Files the agent builds.&lt;/strong&gt; Spreadsheet content, document layout, office files and code project zips.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice and UI details.&lt;/strong&gt; When to decide you've stopped talking (&lt;code&gt;AdaptiveEndOfSpeechDetectorTest&lt;/code&gt;), side panel swipes, navigation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These catch real bugs. A change to the plan parser that breaks on one weird model output shows up in seconds instead of in someone's chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  What they can't tell me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Whether the answer is good.&lt;/strong&gt; Every test runs without a real model. They check that the plumbing works, not that the reply is useful, correct or well written.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whether it works on your phone.&lt;/strong&gt; Unit tests run on my computer. The new signed release build has so far only been checked on an emulator, which is the honest gap I most want to close.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whether a new user gets through setup.&lt;/strong&gt; The biggest drop-off I've seen is the first screen asking for an API key. No unit test would have found that; one person on a forum did.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So "400 tests, 0 failures" means the app is less likely to fall over. It doesn't mean it's good. For that I still need people actually using it.&lt;/p&gt;

&lt;p&gt;If you build apps on top of LLMs: how do you check answer quality without paying for a model call on every test run? Recorded responses, a small eval set, or just trying it yourself?&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Recommended download, the signed release APK (~19 MB, Android 9+): &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/latest" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/latest&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo (tests are under &lt;code&gt;app/src/test&lt;/code&gt;): &lt;a href="https://github.com/kriddss3/kryzz-ai" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honest caveats: you need your own OpenRouter key, it's not on the Play Store, and the release build is emulator-tested only so far. Bug reports, especially from real devices, are very welcome.&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>testing</category>
      <category>showdev</category>
    </item>
    <item>
      <title>The first screen of my Android AI app asks for an API key. That's where most people give up</title>
      <dc:creator>Grokkris</dc:creator>
      <pubDate>Mon, 26 Oct 2026 17:41:55 +0000</pubDate>
      <link>https://dev.to/grokkris_267433fde5540f5b/the-first-screen-of-my-android-ai-app-asks-for-an-api-key-thats-where-most-people-give-up-5hd0</link>
      <guid>https://dev.to/grokkris_267433fde5540f5b/the-first-screen-of-my-android-ai-app-asks-for-an-api-key-thats-where-most-people-give-up-5hd0</guid>
      <description>&lt;p&gt;My app has passed 200 downloads, and the most useful feedback I've had so far wasn't about a feature. It was one person on a forum telling me, twice, that he couldn't get past step one.&lt;/p&gt;

&lt;p&gt;Quick context: Kryzz AI is an MIT-licensed Android app (Kotlin + Jetpack Compose) for chat, voice and agent tasks. It doesn't run models on the phone. You bring your own OpenRouter key and the models are hosted by whichever provider you pick. Chats, memory, files and keys stay on the device, and there's no analytics or telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bring-your-own-key has a cost, and the user pays it first
&lt;/h2&gt;

&lt;p&gt;I picked BYOK on purpose. No server of mine sits between you and the model, I never see your prompts, and I don't need to charge a subscription to cover API bills. I still think that's the right call for a privacy-focused app.&lt;/p&gt;

&lt;p&gt;But it means the very first thing a new user does isn't "try the app". It's "go to another website, make an account, find the keys page, create a key, copy it, come back, paste it". That's five steps before the app has done anything for them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually went wrong
&lt;/h2&gt;

&lt;p&gt;The person who reported it wasn't confused about what a key is. He got stuck at OpenRouter's own sign-up check, which kept timing out for him. Things that seemed to help other people:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;turning off a VPN or ad blocker while signing up&lt;/li&gt;
&lt;li&gt;doing the sign-up in a normal browser instead of an in-app one&lt;/li&gt;
&lt;li&gt;signing up with Google or GitHub instead of email&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then he asked a fair question: can I just use a Grok or Gemini key instead? Right now, no. The app only talks to OpenRouter (which does have those models). That's a real gap, and I've written it down as a feature request.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm thinking of changing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A short first-run guide with a button that opens OpenRouter's key page directly, so nobody has to hunt for it.&lt;/li&gt;
&lt;li&gt;A clear "this key works" or "this key doesn't work, here's why" check right after you paste it.&lt;/li&gt;
&lt;li&gt;Maybe direct support for a couple of other providers' keys, so OpenRouter isn't the only door in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is built yet. I'd rather hear from people who've shipped BYOK apps before I pick one.&lt;/p&gt;

&lt;p&gt;If your app asks users for their own API key: how do you get them through that first step? Did a guide help, or did offering more providers matter more?&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Recommended download, the signed release APK (~19 MB, Android 9+): &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/latest" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/latest&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/kriddss3/kryzz-ai" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honest caveats: you need your own OpenRouter key, it's not on the Play Store, and so far the signed release build has only been tested on an emulator. Bug reports are very welcome.&lt;/p&gt;

</description>
      <category>android</category>
      <category>ux</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I put a 25-cent cap on every turn of my Android AI agent. Here's why a budget beat a smarter prompt</title>
      <dc:creator>Grokkris</dc:creator>
      <pubDate>Sun, 25 Oct 2026 11:54:37 +0000</pubDate>
      <link>https://dev.to/grokkris_267433fde5540f5b/i-put-a-25-cent-cap-on-every-turn-of-my-android-ai-agent-heres-why-a-budget-beat-a-smarter-prompt-27c8</link>
      <guid>https://dev.to/grokkris_267433fde5540f5b/i-put-a-25-cent-cap-on-every-turn-of-my-android-ai-agent-heres-why-a-budget-beat-a-smarter-prompt-27c8</guid>
      <description>&lt;p&gt;The first time I let my own agent run a "research this and make me a spreadsheet" task with my own API key, I didn't look at the bill until afterwards. It wasn't huge. But I realised I had no idea what a single task &lt;em&gt;could&lt;/em&gt; cost, and that's a weird feeling when it's your money and your key.&lt;/p&gt;

&lt;p&gt;That's why Kryzz AI has a per-turn cost cap.&lt;/p&gt;

&lt;p&gt;Quick context: Kryzz AI is an MIT-licensed Android app (Kotlin + Jetpack Compose) for chat, voice and agent tasks. It doesn't run models on the phone. You bring your own OpenRouter key and the models are hosted by whichever provider you pick. Chats, memory, files and keys stay on the device, and there's no analytics or telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the cap does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Every turn has a spending limit. The default is $0.25, and you can raise it up to $2 in settings.&lt;/li&gt;
&lt;li&gt;The chat shows tokens and cost per reply, so the number isn't hidden in a dashboard somewhere.&lt;/li&gt;
&lt;li&gt;Agent tasks come in Fast, Balanced and Max, so you choose how much effort (and money) a task is worth before it starts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why a budget instead of "just make the agent smarter"
&lt;/h2&gt;

&lt;p&gt;When you bring your own key, every extra search, page fetch or retry is paid by you. An agent that loops a few extra times isn't just slow, it's quietly expensive. I could keep tuning prompts to make it loop less, but a hard number is easier to trust than a promise that the prompt is good now.&lt;/p&gt;

&lt;p&gt;A cap also changes how the agent feels to use. You stop babysitting it. You know the worst case before you press send.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm still unsure about
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Is $0.25 a sensible default? It's enough for most chat turns and normal agent tasks with mid-priced models, but heavy models eat it quickly.&lt;/li&gt;
&lt;li&gt;Should the cap be per turn, per task, or per day? Per turn was the simplest to explain, but a daily budget might match how people actually think about money.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've built anything on a pay-per-token API: how do you protect users (or yourself) from a runaway request?&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Recommended download, the signed release APK (~19 MB, Android 9+): &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/latest" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/latest&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/kriddss3/kryzz-ai" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honest caveats: you need your own OpenRouter key, it's not on the Play Store, and so far the signed release build has only been tested on an emulator. Bug reports are very welcome.&lt;/p&gt;

</description>
      <category>android</category>
      <category>ai</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>My "private" Android AI app sends your first message somewhere you might not expect. Here's why I wrote that in the README</title>
      <dc:creator>Grokkris</dc:creator>
      <pubDate>Sat, 24 Oct 2026 10:57:06 +0000</pubDate>
      <link>https://dev.to/grokkris_267433fde5540f5b/my-private-android-ai-app-sends-your-first-message-somewhere-you-might-not-expect-heres-why-i-kc7</link>
      <guid>https://dev.to/grokkris_267433fde5540f5b/my-private-android-ai-app-sends-your-first-message-somewhere-you-might-not-expect-heres-why-i-kc7</guid>
      <description>&lt;p&gt;When I rewrote the README for Kryzz AI this week, the hardest section to write wasn't the feature list. It was one paragraph in the privacy section about chat titles.&lt;/p&gt;

&lt;p&gt;Kryzz AI is an MIT-licensed Android app (Kotlin + Jetpack Compose) for chat, voice and agent tasks. Chats, memory, files and API keys stay on the phone. Keys are encrypted with AES-GCM under a non-exportable Android Keystore key, and there's no analytics, no telemetry and no bundled keys. The models themselves are hosted, not on-device: you bring your own OpenRouter key and your prompts go to whichever provider you pick.&lt;/p&gt;

&lt;p&gt;So far, so normal for a "bring your own key" app. But there's one extra request that's easy to miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  The auto-title request
&lt;/h2&gt;

&lt;p&gt;When you start a new chat, the app names it for you. To do that it sends the first part of your first message (up to 1,500 characters) to a small model, Gemini 2.5 Flash Lite, through your OpenRouter key. It runs in parallel with the real answer, and if it fails the app falls back to a local title.&lt;/p&gt;

&lt;p&gt;It's the same key and the same route as the rest of the chat, so it's not a hidden server of mine. But it is a second request to a model you may not have picked, and if you chose a specific provider for privacy reasons you deserve to know that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I put it in the README instead of burying it
&lt;/h2&gt;

&lt;p&gt;I could have left it out. Nobody would have noticed for a while. But "no telemetry" only means something if the list of what &lt;em&gt;does&lt;/em&gt; leave the phone is complete. A privacy section that's 95% honest is basically marketing.&lt;/p&gt;

&lt;p&gt;So the README now says, in plain words:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what stays on the phone (chats, memory, library, keys, generated files)&lt;/li&gt;
&lt;li&gt;what leaves it (your prompts to the provider you choose, the title request above, web search and allowed page fetches when the agent uses them)&lt;/li&gt;
&lt;li&gt;what's switched off (Android backup, device transfer, cleartext traffic, HTTP logging)&lt;/li&gt;
&lt;li&gt;the mic is only on during a voice session, and recorded audio is deleted after transcription&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What would you do?
&lt;/h2&gt;

&lt;p&gt;Two possible changes I can see:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A setting to turn auto-titles off (local titles only).&lt;/li&gt;
&lt;li&gt;Sending the title request to the same model the user picked for the chat.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you've built a BYOK app: did you hit this kind of "small side request" problem, and how did you handle it?&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/kriddss3/kryzz-ai" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Download (signed release APK, ~19 MB, Android 9+): &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/latest" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/latest&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honest caveats: you need your own OpenRouter key, it's not on the Play Store or F-Droid yet, and the new signed release build has only been checked for a clean launch on an Android 15 emulator so far. Bug reports welcome.&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>android</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>My Android AI app finally has a signed release APK. It went from 82 MB to 19 MB</title>
      <dc:creator>Grokkris</dc:creator>
      <pubDate>Fri, 23 Oct 2026 16:41:23 +0000</pubDate>
      <link>https://dev.to/grokkris_267433fde5540f5b/my-android-ai-app-finally-has-a-signed-release-apk-it-went-from-82-mb-to-19-mb-1aap</link>
      <guid>https://dev.to/grokkris_267433fde5540f5b/my-android-ai-app-finally-has-a-signed-release-apk-it-went-from-82-mb-to-19-mb-1aap</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqvbpx1308d2zihi52ohf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqvbpx1308d2zihi52ohf.gif" alt="Kryzz AI planning a task, searching, then building a spreadsheet" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For two months the only way to install Kryzz AI, my free, open-source (MIT) Android AI app, was a debug APK. I kept writing "a signed release build is on my list" at the bottom of every post. Today it's out, so this is the short version of what changed and what didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Signed with a release key.&lt;/strong&gt; Package is &lt;code&gt;ai.daylight.assistant&lt;/code&gt;. The cert SHA-256 is in the README and the release notes, so you can check it before you install.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minified, ~19 MB instead of ~82 MB.&lt;/strong&gt; Most of the old size was debug overhead, not features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works with Obtainium.&lt;/strong&gt; Point it at the repo and filter for &lt;code&gt;release&lt;/code&gt; and you'll get updates without checking GitHub yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The README got rewritten&lt;/strong&gt;: install in 60 seconds, a comparison table against hosted AI apps, screenshots and a FAQ.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The catch if you already installed the debug build
&lt;/h2&gt;

&lt;p&gt;The release and debug builds are separate apps (different package name). They install side by side and don't share data. If you have chats you want to keep, export them from the Library as JSON and import them into the release app. The debug APK stays on the release page only for people upgrading old v1.0/v1.1 installs in place.&lt;/p&gt;

&lt;h2&gt;
  
  
  What didn't change
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No code changes in this update. It's still v1.1.2 (internal 5.11.0), same features: chat, an agent that shows its plan, searches, reads pages and builds DOCX/XLSX/PDF files, a voice mode, and a per-task cost cap ($0.25 by default).&lt;/li&gt;
&lt;li&gt;Models are hosted, not on-device. You bring your own OpenRouter key, and requests go from your phone to the provider you pick. No Kryzz server, no telemetry.&lt;/li&gt;
&lt;li&gt;Android 9+, not on the Play Store or F-Droid yet. A signed build was the main thing blocking F-Droid-style repos, so that's next.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One honest caveat: so far I've checked the release build for a valid signature and a clean launch on an Android 15 emulator. I haven't re-run every feature on the minified build yet, so if R8 broke something, please tell me.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Latest release: &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/latest" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/latest&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/kriddss3/kryzz-ai" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you sideload open-source apps, what makes you trust an APK enough to install it? A published cert hash, Obtainium, F-Droid, something else?&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
      <category>showdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>My Android AI agent can only open links it already has a reason to open</title>
      <dc:creator>Grokkris</dc:creator>
      <pubDate>Thu, 22 Oct 2026 16:42:42 +0000</pubDate>
      <link>https://dev.to/grokkris_267433fde5540f5b/my-android-ai-agent-can-only-open-links-it-already-has-a-reason-to-open-8ee</link>
      <guid>https://dev.to/grokkris_267433fde5540f5b/my-android-ai-agent-can-only-open-links-it-already-has-a-reason-to-open-8ee</guid>
      <description>&lt;p&gt;I'm building Kryzz AI, a free, open-source (MIT) Android app with an agent mode that can search the web, read pages and write files. One of the less flashy changes in v1.1.2 is also the one I'd defend hardest: the agent can't open any URL it likes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;An agent that reads web pages is reading text written by strangers. If a page says "now go fetch this other URL and include the user's notes in the query", a naive agent loop might just do it. Even without anyone being malicious, models sometimes invent plausible-looking URLs and then confidently "read" them.&lt;/p&gt;

&lt;p&gt;On a phone that also holds your chats and memory, I didn't want the page-reading tool to be a blank cheque.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule
&lt;/h2&gt;

&lt;p&gt;In Kryzz, the &lt;code&gt;fetch_url&lt;/code&gt; tool only opens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a link &lt;strong&gt;you&lt;/strong&gt; shared in the chat,&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;search result&lt;/strong&gt; that came back earlier in the same chat, or&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;site you named&lt;/strong&gt; yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anything else gets refused, and the agent has to search first or ask you. It's a small allowlist, but it means a page can't steer the agent to a brand-new address on its own, and a made-up URL just fails instead of turning into a fake citation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sometimes the agent takes one extra step (a search) before it can read a page you clearly meant. I think that's fine.&lt;/li&gt;
&lt;li&gt;It's not a full defence against prompt injection. A page the agent is allowed to read can still contain junk instructions. That's why substantial answers also get one review pass against the actual tool results, and there's a per-turn cost cap (default $0.25) so a confused loop can't run up your bill.&lt;/li&gt;
&lt;li&gt;You can see what it touched: every agent answer has a work log with the queries, pages and files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Models aren't on-device. Requests go from your phone to OpenRouter (or the optional providers you turn on). No Kryzz server in the middle, no telemetry.&lt;/li&gt;
&lt;li&gt;The APK is a debug build, Android 9+. A signed release build is still on my list.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Release (v1.1.2): &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/kriddss3/kryzz-ai" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've built agents that browse, how do you limit what they're allowed to open? I'm curious whether people go stricter than this or looser.&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>android</category>
      <category>showdev</category>
    </item>
    <item>
      <title>What "no telemetry" actually means in my Android AI app (and what it doesn't)</title>
      <dc:creator>Grokkris</dc:creator>
      <pubDate>Wed, 21 Oct 2026 16:44:32 +0000</pubDate>
      <link>https://dev.to/grokkris_267433fde5540f5b/what-no-telemetry-actually-means-in-my-android-ai-app-and-what-it-doesnt-2022</link>
      <guid>https://dev.to/grokkris_267433fde5540f5b/what-no-telemetry-actually-means-in-my-android-ai-app-and-what-it-doesnt-2022</guid>
      <description>&lt;p&gt;I'm building Kryzz AI, a free, open-source (MIT) Android app for chat, voice and agent tasks. A lot of apps say "privacy-first" and leave it there, so here's the plain version of what that means in mine, including the parts that aren't private.&lt;/p&gt;

&lt;h2&gt;
  
  
  What stays on the phone
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chats and memory&lt;/strong&gt; are stored on the device. There's no Kryzz account and no Kryzz server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API keys&lt;/strong&gt; are yours. You paste them in, and they're encrypted with the Android Keystore. No keys ship inside the APK.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generated files&lt;/strong&gt; (DOCX, XLSX, PDF) sit in private app storage until you choose to share them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No analytics, no telemetry, no HTTP logging.&lt;/strong&gt; I turned those off on purpose, and since the code is MIT you can check that yourself instead of trusting me.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What leaves the phone
&lt;/h2&gt;

&lt;p&gt;This is the part people skip, so I'll be direct:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The models are not on-device.&lt;/strong&gt; When you send a message, it goes from your phone to OpenRouter, or to the optional providers you turn on (MiniMax, Fish Audio for voice, Parallel for web research). Those providers see the prompt. That's the trade for using strong models on a phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web research&lt;/strong&gt; means the agent fetches pages, so those sites see the requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I can promise is that nothing goes through me in the middle. Your key, your bill, your provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I care about the boring bits
&lt;/h2&gt;

&lt;p&gt;The agent can run multi-step tasks: it keeps a live plan, runs searches, and writes files. An agent with that much access should be easy to audit. That's also why there's a work log under each answer ("3 searches · read 4 pages · 1 file") and a per-turn cost cap (default $0.25), so you can see what it did and it can't quietly burn your credit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The APK on the release page is a debug build, Android 9+. A properly signed release build is on my list.&lt;/li&gt;
&lt;li&gt;I'm one person building this, so "you can read the code" is a real part of the trust story, not a slogan.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Release (v1.1.2): &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/kriddss3/kryzz-ai" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've shipped an Android app that talks to cloud models, how do you explain the "what leaves the phone" part to users? I'd like to steal a better way of saying it.&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>android</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>My Android AI agent writes every file as Markdown first. Here's why that made DOCX, XLSX and PDF less painful</title>
      <dc:creator>Grokkris</dc:creator>
      <pubDate>Tue, 20 Oct 2026 16:43:54 +0000</pubDate>
      <link>https://dev.to/grokkris_267433fde5540f5b/my-android-ai-agent-writes-every-file-as-markdown-first-heres-why-that-made-docx-xlsx-and-pdf-3e4h</link>
      <guid>https://dev.to/grokkris_267433fde5540f5b/my-android-ai-agent-writes-every-file-as-markdown-first-heres-why-that-made-docx-xlsx-and-pdf-3e4h</guid>
      <description>&lt;p&gt;I'm building Kryzz AI, a free, open-source (MIT) Android app for chat, voice and agent tasks. One thing people actually use the agent for is getting a real file at the end: a report as a DOCX, a table as an XLSX, something you can send as a PDF.&lt;/p&gt;

&lt;p&gt;Three formats get messy fast if each exporter has its own idea of what a heading or a table is. A table can look fine in one format and come out flat in another, and fixing one can break the next.&lt;/p&gt;

&lt;p&gt;So in v1.1.2 all three share one Markdown model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What that means in practice
&lt;/h2&gt;

&lt;p&gt;The agent writes its output once, as structured Markdown. Then each exporter reads the same structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Headings and lists&lt;/strong&gt; come out as real headings and lists in the DOCX, not bold text pretending to be a heading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tables&lt;/strong&gt; keep their shape across DOCX and PDF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spreadsheets get typed cells.&lt;/strong&gt; A number stays a number, so you can actually sum a column in the XLSX instead of fighting text that looks like numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-sheet workbooks&lt;/strong&gt; work, so a research task can put sources on one sheet and the summary on another.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDFs handle Unicode&lt;/strong&gt;, which matters to me because I write in both English and French.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I like this setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The model only has to be good at one thing: writing clean Markdown. Models are already decent at that.&lt;/li&gt;
&lt;li&gt;When an export looks wrong, there's one place to look.&lt;/li&gt;
&lt;li&gt;Adding a new output later should mostly mean writing one more exporter, not teaching the agent a new format.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The rest of the loop, briefly
&lt;/h2&gt;

&lt;p&gt;The file is the last step. Before it, the agent keeps a live checklist plan, runs searches and page reads, and for substantial answers does one review pass against what the tools actually returned. Under each answer there's a work log ("3 searches · read 4 pages · 1 file") so you can see what it did. There's also a per-turn cost cap (default $0.25) because you bring your own OpenRouter key and pay for your own usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The models are not on-device. Requests go from your phone to OpenRouter (or the optional providers you turn on). No analytics, no telemetry, no bundled keys.&lt;/li&gt;
&lt;li&gt;Generated files stay in private app storage until you share them.&lt;/li&gt;
&lt;li&gt;The APK on the release page is a debug build, Android 9+.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Release (v1.1.2): &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="https://github.com/kriddss3/kryzz-ai" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've built document export on Android, I'd like to know what you used and what broke. And if you try the app, tell me which file type comes out worst. That's the one I'll fix next.&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>androiddev</category>
      <category>showdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I sent my Android app to ~20 AI directories in a week. Almost none of it moved downloads.</title>
      <dc:creator>Grokkris</dc:creator>
      <pubDate>Mon, 19 Oct 2026 16:48:47 +0000</pubDate>
      <link>https://dev.to/grokkris_267433fde5540f5b/i-sent-my-android-app-to-20-ai-directories-in-a-week-almost-none-of-it-moved-downloads-gi1</link>
      <guid>https://dev.to/grokkris_267433fde5540f5b/i-sent-my-android-app-to-20-ai-directories-in-a-week-almost-none-of-it-moved-downloads-gi1</guid>
      <description>&lt;p&gt;I'm a student and I build Kryzz AI on the side. It's a free, MIT-licensed Android app: you give an agent a task, it shows a checklist plan first, searches and reads pages, then hands you an actual DOCX, XLSX or PDF. Models go through your own OpenRouter key, everything else stays on the phone.&lt;/p&gt;

&lt;p&gt;Last week I gave myself a goal: go from 141 to 200 total APK downloads on GitHub in about ten days. I'm at 166 right now, so not there yet, but the split was useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I tried
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Around 20 small "submit your AI tool" directories.&lt;/strong&gt; Roughly one extra download a day across all of them. Most are still "in review", and a few wanted a backlink badge or a paid fast lane, which I skipped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show HN.&lt;/strong&gt; 2 points, no comments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dev.to posts.&lt;/strong&gt; Close to zero reactions so far (hi, if you're reading this one).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One XDA Forums thread.&lt;/strong&gt; The first place where people asked real questions: how the cost cap works, how good the generated files are, whether voice mode handles interruptions. The day I answered them, downloads went from 155 to 166. Can't prove it was only that, but it's the biggest jump of the week.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I think it means
&lt;/h2&gt;

&lt;p&gt;Listings don't bring people, conversations do. Places where Android users already hang out beat places built for launching. A thread where someone can ask "does it actually do X" and get a straight answer seems worth more than twenty listings nobody browses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things I'm still unsure about
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The APK is a debug build for now. Would that stop you installing from GitHub, or for a free app do you not care?&lt;/li&gt;
&lt;li&gt;Would you put a big "Download APK" link at the very top of the README, or does that look desperate?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Repo and APK if you want to poke at it: &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>android</category>
      <category>marketing</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I gave my Android AI agent a $0.25 budget per task. Here's how it still finishes.</title>
      <dc:creator>Grokkris</dc:creator>
      <pubDate>Sun, 18 Oct 2026 10:54:33 +0000</pubDate>
      <link>https://dev.to/grokkris_267433fde5540f5b/i-gave-my-android-ai-agent-a-025-budget-per-task-heres-how-it-still-finishes-20o3</link>
      <guid>https://dev.to/grokkris_267433fde5540f5b/i-gave-my-android-ai-agent-a-025-budget-per-task-heres-how-it-still-finishes-20o3</guid>
      <description>&lt;p&gt;I've been building Kryzz AI, a free MIT-licensed Android app where you hand an agent a task and it plans, searches, reads pages and gives you back an actual file. It runs on your own OpenRouter key, so every step it takes costs you real money. That made one problem impossible to ignore: agent loops quietly burn credit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;On a laptop you might watch an agent run. On a phone you put it in your pocket. If the agent decides to search twelve more times "just to be sure", you find out when you check your OpenRouter balance. People who bring their own key notice that fast, and they don't come back.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule
&lt;/h2&gt;

&lt;p&gt;Every turn has a hard cost cap. The default is $0.25 and you can raise it up to $2 in settings. The planning step doesn't count against that budget, so the agent can always at least tell you what it intends to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens when it hits the cap
&lt;/h2&gt;

&lt;p&gt;This is the part I spent the most time on. The easy version is to throw a "budget exceeded" error and stop. That's the worst outcome: you paid for the searches and got nothing.&lt;/p&gt;

&lt;p&gt;Instead, when the cap is close, the agent stops calling tools and writes the best answer it can from what it already collected. The work log under the answer shows what it did and what it skipped, so you can tell whether to rerun with a bigger budget or whether it's good enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fast / Balanced / Max
&lt;/h2&gt;

&lt;p&gt;The cap works together with three quality modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; skips the review pass and keeps the step count low.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Balanced&lt;/strong&gt; is the default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Max&lt;/strong&gt; gets a 24-step budget plus a review pass before it hands the answer over.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of my own tasks run fine on Balanced. Max is for the "compare these and give me a spreadsheet" kind of task where a second look actually catches mistakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  An example run
&lt;/h2&gt;

&lt;p&gt;Prompt: "Compare 3 budget phones, read the reviews and make me a spreadsheet."&lt;/p&gt;

&lt;p&gt;It shows the plan as a checklist first, runs the searches and page reads in parallel, checks the numbers, and returns an .xlsx with sources. The chip under the answer says something like "3 searches · read 4 pages · 1 file", and tapping it shows every query and URL.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/RheYy473mRU" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Models are not on-device. Requests go from your phone straight to the provider behind your OpenRouter key.&lt;/li&gt;
&lt;li&gt;No analytics, no telemetry, no bundled keys. Chats, memory and files stay in app storage.&lt;/li&gt;
&lt;li&gt;The current APK is a debug build (Android 9+). A release-signed build is planned.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Free APK and MIT source: &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm genuinely unsure about the default. Is $0.25 per task too low, too high, or should it ask before going over? I'd like to hear where you'd set it.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>android</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Why my Android AI app shows its plan before it does anything</title>
      <dc:creator>Grokkris</dc:creator>
      <pubDate>Sat, 17 Oct 2026 08:48:30 +0000</pubDate>
      <link>https://dev.to/grokkris_267433fde5540f5b/why-my-android-ai-app-shows-its-plan-before-it-does-anything-4kmo</link>
      <guid>https://dev.to/grokkris_267433fde5540f5b/why-my-android-ai-app-shows-its-plan-before-it-does-anything-4kmo</guid>
      <description>&lt;p&gt;I've been building Kryzz AI on weekends and evenings for a few months. It's an open-source Android app for chatting with AI models, talking to them by voice, and letting an agent do small multi-step jobs. It's MIT-licensed and the code is on GitHub.&lt;/p&gt;

&lt;p&gt;This post is about one design choice that ended up shaping most of the app: the agent has to show you what it's going to do while it does it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with "magic" agents on a phone
&lt;/h2&gt;

&lt;p&gt;When I tried agent features in other apps, the thing that bothered me most wasn't bad answers. It was not knowing what happened. Did it actually open that page? Did it make up the source? Did it just spend a dollar of my API credit on a loop?&lt;/p&gt;

&lt;p&gt;On a phone that feels worse, because you're usually half paying attention. So I wanted the agent to be boring and visible instead of clever and hidden.&lt;/p&gt;

&lt;h2&gt;
  
  
  What that looks like in v1.1.2
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A live plan card.&lt;/strong&gt; When you ask for something in Agent Auto, it writes a short plan first and ticks steps off as it goes. If the plan looks wrong you can stop it early.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A work log.&lt;/strong&gt; Every search, page read and file it touches shows up as a small chip, so you can check where an answer came from.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only allowed links get fetched.&lt;/strong&gt; Page reads go through a filter instead of following whatever URL the model invents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review before send.&lt;/strong&gt; Longer answers get a second pass before they're shown to you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A cost cap.&lt;/strong&gt; Default is $0.25 per task, adjustable up to $2, so a runaway loop can't drain your key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast / Balanced / Max.&lt;/strong&gt; One chip to trade speed for quality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real files at the end.&lt;/strong&gt; It can hand back a DOCX, XLSX or PDF instead of a wall of text.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Local-first
&lt;/h2&gt;

&lt;p&gt;Chats stay on the device. You bring your own API key for whichever provider you use, and there's no telemetry. I can't promise "nothing ever leaves the phone" because the model call itself goes to your provider, but nothing goes to me.&lt;/p&gt;

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

&lt;p&gt;Kotlin and Jetpack Compose. The file outputs share one Markdown model that gets rendered into DOCX, XLSX or PDF, which kept the export code a lot smaller than I expected.&lt;/p&gt;

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

&lt;p&gt;It's still early. The release is a debug APK, so expect rough edges.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/kriddss3/kryzz-ai" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;v1.1.2 release (APK): &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Short demo:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/RheYy473mRU" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;If you've built agent features yourself, I'd like to hear how you handle the "what is it doing right now" problem. Issues and PRs on GitHub are welcome.&lt;/p&gt;

</description>
      <category>android</category>
      <category>opensource</category>
      <category>ai</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>Kryzz AI v1.1 — open-sourcing a local-first Android AI workspace</title>
      <dc:creator>Grokkris</dc:creator>
      <pubDate>Wed, 09 Sep 2026 13:17:06 +0000</pubDate>
      <link>https://dev.to/grokkris_267433fde5540f5b/kryzz-ai-v11-open-sourcing-a-local-first-android-ai-workspace-481a</link>
      <guid>https://dev.to/grokkris_267433fde5540f5b/kryzz-ai-v11-open-sourcing-a-local-first-android-ai-workspace-481a</guid>
      <description>&lt;p&gt;I open-sourced Kryzz AI: a private, local-first Android AI workspace for chat, voice, and tool-driven agents. Affiliation: I built this. MIT. The GitHub release includes a &lt;strong&gt;debug APK&lt;/strong&gt; for sideloading (Android 9+), not a Play Store build.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/RheYy473mRU" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Update: v1.1.2 (Agent Auto)
&lt;/h2&gt;

&lt;p&gt;Agent Auto now keeps a &lt;strong&gt;live plan&lt;/strong&gt; through the turn, reviews substantial answers before send, and writes finished &lt;strong&gt;DOCX / XLSX / PDF&lt;/strong&gt;. Fast / Balanced / Max on the composer, a work log with search/page/file chips, safer &lt;code&gt;fetch_url&lt;/code&gt;, and a per-turn cost cap (default $0.25).&lt;/p&gt;

&lt;p&gt;Still local-first: BYO keys, Keystore, no telemetry. MIT. Debug APK (internal 5.11.0): &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1.2&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why
&lt;/h2&gt;

&lt;p&gt;A lot of AI apps are thin clients to someone else’s cloud, with telemetry baked in. I wanted the control plane on my phone — storage, memory, skills, voice — with BYO provider keys.&lt;/p&gt;

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

&lt;p&gt;Kotlin, Jetpack Compose (Material 3), Room, DataStore, OkHttp. Credentials use AES-GCM under Android Keystore. No bundled keys, no analytics, no HTTP logging of chats.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s new in v1.1
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;MiniMax as another chat/agent/media provider next to OpenRouter&lt;/li&gt;
&lt;li&gt;Agent Auto: multi-step tool loop (search, fetch_url, calculate, weather, memory, reminders, PDF/code zips, ask_user)&lt;/li&gt;
&lt;li&gt;Question cards in Chat and Agent&lt;/li&gt;
&lt;li&gt;Starter skills on first launch&lt;/li&gt;
&lt;li&gt;KryzzBot mascot, 120 Hz support, more reliable side panel&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Source + debug APK: &lt;a href="https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1" rel="noopener noreferrer"&gt;https://github.com/kriddss3/kryzz-ai/releases/tag/v1.1&lt;/a&gt;&lt;br&gt;
Feedback welcome, especially on the agent tool loop and first-run UX.&lt;/p&gt;

</description>
      <category>android</category>
      <category>opensource</category>
      <category>ai</category>
      <category>kotlin</category>
    </item>
  </channel>
</rss>
