<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Rally — Tennnis</title><description>Notes from the Tennnis studio. Build logs, playbooks, pricing and launch numbers.</description><link>https://tennnis.no</link><language>en</language><item><title>What is on-device AI, and does it actually keep your data private?</title><link>https://tennnis.no/blog/what-is-on-device-ai</link><guid isPermaLink="true">https://tennnis.no/blog/what-is-on-device-ai</guid><description>On-device AI runs on your phone&apos;s own chip, so what you type or photograph never leaves it. Since iOS 27, &quot;built with Apple&apos;s AI&quot; no longer guarantees that. How to tell, and how to choose.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><category>Playbook</category></item><item><title>How to open source a side project (what Agency taught me)</title><link>https://tennnis.no/blog/open-source-a-side-project</link><guid isPermaLink="true">https://tennnis.no/blog/open-source-a-side-project</guid><description>Before you open source a side project you built for yourself, run it on a machine that has never seen your setup. What open sourcing Agency took, from logs and signing to a Linux port.</description><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><category>Build log</category></item><item><title>How to run multiple AI coding agents in parallel without them overwriting each other</title><link>https://tennnis.no/blog/run-multiple-ai-coding-agents</link><guid isPermaLink="true">https://tennnis.no/blog/run-multiple-ai-coding-agents</guid><description>Give every agent its own git worktree and branch, then review each diff before you merge. The steps by hand, what Claude Code, Codex and Cursor automate, and the traps.</description><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><category>Playbook</category></item><item><title>Why we stopped using tmux for AI coding agents</title><link>https://tennnis.no/blog/eight-days-of-tmux</link><guid isPermaLink="true">https://tennnis.no/blog/eight-days-of-tmux</guid><description>We ran Claude Code and Codex inside tmux for eight days. Dead panes and blank reattaches pushed us to a small Rust daemon that keeps every agent&apos;s screen.</description><pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate><category>Build log</category></item><item><title>How to use Apple Foundation Models without them making things up</title><link>https://tennnis.no/blog/senba-hands-back-proof-not-praise</link><guid isPermaLink="true">https://tennnis.no/blog/senba-hands-back-proof-not-praise</guid><description>Apple&apos;s on-device model is good with words and bad with facts. In Senba, code picks the facts, the model writes the words, and a validator checks every line.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><category>Build log</category></item><item><title>Why every dumb phone app for iPhone looks the same</title><link>https://tennnis.no/blog/a-dumb-phone-app-is-just-a-menu</link><guid isPermaLink="true">https://tennnis.no/blog/a-dumb-phone-app-is-just-a-menu</guid><description>Apple rejects home screen replacements, so every dumb phone app for iPhone is a text-list widget that opens Spotify. What a real one has to own instead.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate><category>Build log</category></item><item><title>How to get a fixed-price quote for an app (and what it should include)</title><link>https://tennnis.no/blog/how-we-scope-a-fixed-price-project</link><guid isPermaLink="true">https://tennnis.no/blog/how-we-scope-a-fixed-price-project</guid><description>A fixed-price app quote that holds lists every screen and state, prices each line, adds a change budget, and moves anything unknown into paid discovery.</description><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate><category>Playbook</category></item></channel></rss>