<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Delino Blog]]></title><description><![CDATA[Delino Blog]]></description><link>https://blog.delino.io</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 05:48:45 GMT</lastBuildDate><atom:link href="https://blog.delino.io/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Introducing the `with-watch` CLI tool]]></title><description><![CDATA[Doc: https://oss.delino.io/with-watch

Repo: https://github.com/delinoio/oss/tree/main/crates/with-watch



I spend a lot of time in the shell, and I keep running into the same small frustration.
Insi]]></description><link>https://blog.delino.io/2026-4-10-with-watch</link><guid isPermaLink="true">https://blog.delino.io/2026-4-10-with-watch</guid><dc:creator><![CDATA[DongYoon Kang]]></dc:creator><pubDate>Fri, 10 Apr 2026 20:32:24 GMT</pubDate><content:encoded><![CDATA[<ul>
<li><p>Doc: <a href="https://oss.delino.io/with-watch">https://oss.delino.io/with-watch</a></p>
</li>
<li><p>Repo: <a href="https://github.com/delinoio/oss/tree/main/crates/with-watch">https://github.com/delinoio/oss/tree/main/crates/with-watch</a></p>
</li>
</ul>
<hr />
<p>I spend a lot of time in the shell, and I keep running into the same small frustration.</p>
<p>Inside our company repo, I kept seeing the same pattern play out in different ways. In some places, we had custom scripts just to get watch-based recompilation or repeat a file operation. In other places, we deliberately gave up on small bits of automation, like automatic <code>cp</code>, because building a dedicated solution for them felt like overengineering. The result was inconsistent workflows around a problem that should have felt simple.</p>
<p>I wanted the convenience of "watch mode," but I did not want to stop using the commands I already reach for every day. I did not want to wrap everything in a bespoke script. I did not want to move simple workflows into a task runner just to get automatic reruns. I wanted to keep using <code>grep</code>, <code>cp</code>, <code>sed</code>, <code>ls</code>, and <code>cargo test</code>, and I wanted them to run again when their inputs changed.</p>
<p>That is why I built <code>with-watch</code>.</p>
<p><code>with-watch</code> is a Rust CLI that reruns a delegated command when its inferred or explicit filesystem inputs change. The idea is simple: keep your existing command line, add a small wrapper, and get repeatable reruns without changing how you work. More than anything, I wanted the API to feel user-friendly: no new workflow to memorize, no new config format to invent, and as little change to the original command as possible.</p>
<p>The approach I cared about most was this: in many cases, the user has already expressed the watch requirement in the command they typed. The job is not to ask for a second description of intent. The job is to read the intent that is already there and turn it into a watch plan.</p>
<h2>Why I built it</h2>
<p>Most watch tools are great when your workflow already fits their model. But a lot of day-to-day shell work is more direct than that.</p>
<p>What pushed me over the edge was seeing how uneven this became in a real codebase. For watch-based recompilation, some parts of our repo had accumulated custom scripts. Elsewhere, we skipped automating a simple copy step because we did not want to build yet another layer around it. Both choices were understandable on their own, but together they pointed to the same missing tool.</p>
<p>Before <code>with-watch</code>, I even used <a href="https://github.com/air-verse/air">Air</a> for jobs like protobuf recompilation. It worked well, but in a larger project it also meant carrying more project-level configuration than I wanted for something as small as rerunning <code>protoc</code>. That experience made the gap even clearer to me: I did not just want live reload for one category of workflow. I wanted a small, user-friendly, input-driven interface that I could apply to the commands I was already running.</p>
<p>Sometimes I just want to:</p>
<ul>
<li><p>re-run <code>grep hello input.txt</code> whenever the file changes</p>
</li>
<li><p>re-run <code>cp src.txt dest.txt</code> when the source changes</p>
</li>
<li><p>re-run a small shell pipeline while I am iterating</p>
</li>
<li><p>re-run <code>cargo test</code> for a specific crate when files under <code>src/</code> change</p>
</li>
</ul>
<p>I wanted a tool that respected those workflows instead of asking me to adopt a new one. I wanted something light enough that I would actually use it for the boring cases where writing a custom watcher felt silly, but structured enough that I did not have to keep rebuilding the same tiny automation in different corners of the repo. I wanted a user-friendly API: something you could understand in seconds, not something that required learning a new DSL, config model, or command vocabulary before it became useful.</p>
<p>I also wanted it to be conservative. If a tool can safely infer what to watch, great. If it cannot, it should not guess. It should fail clearly and give me a way to be explicit. That is the design principle I kept coming back to while building <code>with-watch</code>: convenience when the intent is obvious, and an escape hatch when it is not.</p>
<h2>What <code>with-watch</code> is</h2>
<p>At a high level, <code>with-watch</code> sits in front of a command and watches the files or directories that matter for that command.</p>
<p>That sounds ordinary, but the important part is where the watch plan comes from. I wanted the command itself to be the starting point. If someone types <code>cp src.txt dest.txt</code>, the input already tells us something meaningful about what should be watched and what should be treated as output. If someone types <code>grep hello input.txt</code>, the input already tells us where the read dependency is. The watch requirement is often already embedded in the command; <code>with-watch</code> is built around extracting that instead of demanding a separate layer of configuration.</p>
<p>It supports three command modes:</p>
<pre><code class="language-sh">with-watch [--no-hash] &lt;utility&gt; [args...]
with-watch [--no-hash] --shell '&lt;expr&gt;'
with-watch exec [--no-hash] --input &lt;glob&gt;... -- &lt;command&gt; [args...]
</code></pre>
<p>The first mode is the one I wanted most: wrap a familiar utility and let <code>with-watch</code> infer the inputs.</p>
<p>The second mode is for simple shell command lines on Unix-like platforms that need operators like <code>&amp;&amp;</code>, <code>||</code>, or <code>|</code>.</p>
<p>The third mode is the explicit escape hatch. If inference would be ambiguous, or if the delegated command does not have stable filesystem inputs on its own, <code>exec --input</code> lets me say exactly what should trigger a rerun.</p>
<h2>How it works in practice</h2>
<p>Here are a few real examples that match the current CLI and docs:</p>
<pre><code class="language-sh">with-watch grep hello input.txt
with-watch cp src.txt dest.txt
with-watch ls -l
with-watch --shell 'grep hello src.txt | wc -l'
with-watch sed -i.bak -e 's/old/new/' config.txt
with-watch exec --input 'src/**/*.rs' -- cargo test -p with-watch
</code></pre>
<p>That mix is what makes the tool feel useful to me.</p>
<p>For straightforward commands, I can stay in passthrough mode and let <code>with-watch</code> do the boring part. For a quick one-liner pipeline, I can use <code>--shell</code>. For something like <code>cargo test</code>, where I want to define the watch set myself, I can use <code>exec --input</code> and keep the original command untouched.</p>
<p>That last detail matters to me: <code>with-watch</code> reruns the delegated command exactly as provided. It does not inject changed file paths into argv. It does not rewrite the command line behind the scenes. It just decides when to run the command again.</p>
<h2>The design choices I cared about most</h2>
<h3>1. Treat the user's command as the primary source of truth</h3>
<p>This is the core idea behind the tool.</p>
<p>I did not want watch behavior to start from a separate config file, a second DSL, or an extra description of what the user meant. In many cases, the requirement is already present in the input. The command, its operands, and even parts of shell syntax already contain the information needed to build a useful watch plan.</p>
<p>That is why passthrough mode is the default shape of the tool. It is also why <code>exec --input</code> is an escape hatch rather than the main interface. I wanted explicit inputs to be available when needed, but I wanted the primary experience to begin with the command the user was already going to run.</p>
<h3>2. Run once immediately</h3>
<p>After input inference, watcher setup, and baseline capture succeed, <code>with-watch</code> performs one initial run right away.</p>
<p>That sounds small, but it makes the tool feel natural. I do not want to start a watch command and then wait for the first file change just to confirm that everything is wired correctly. I want the command to run once immediately, then keep running when inputs change later.</p>
<h3>3. Prefer real content changes by default</h3>
<p>By default, <code>with-watch</code> compares content hashes when it decides whether to rerun.</p>
<p>This is not just a theoretical preference for me. It comes from real workflow friction. In practice, I kept running into cases where a rerun happened because something in the pipeline wrote to the filesystem again, even though the actual content had not meaningfully changed. When that happens, I usually do not want the rest of the pipeline to keep flowing. I want it to stop as early as possible, or at least in the middle, instead of paying for more downstream work that does not represent a real change.</p>
<p>I recently made a similar optimization in my day job: if the content-based result had not changed, the step would skip the filesystem write entirely. That experience reinforced the same instinct behind <code>with-watch</code>: treat real content changes as the thing that matters most, and avoid turning incidental rewrites into more work.</p>
<p>If I want metadata-only comparison instead, I can opt into it with:</p>
<pre><code class="language-sh">with-watch --no-hash grep hello input.txt
</code></pre>
<p>That keeps the default behavior more intentional while still leaving room for the lighter-weight mode when it is the right tradeoff.</p>
<h3>4. Fail safely when inference is not trustworthy</h3>
<p>One of the easiest ways to make a watch tool feel magical is also one of the easiest ways to make it feel wrong: infer too much.</p>
<p>I did not want <code>with-watch</code> to pretend it knows what to watch when it really does not. If it cannot infer safe filesystem inputs from the delegated command, it fails with guidance instead of guessing. The answer in those cases is to use <code>exec --input</code> and make the watch set explicit.</p>
<p>That tradeoff is deliberate. I would rather make the explicit path easy than make the implicit path unpredictable.</p>
<h3>5. Do not loop forever on self-mutating commands</h3>
<p>Commands like this are common:</p>
<pre><code class="language-sh">with-watch sed -i.bak -e 's/old/new/' config.txt
</code></pre>
<p>This kind of command mutates a watched input. A naive watcher can easily end up retriggering itself forever.</p>
<p><code>with-watch</code> avoids that by refreshing its baseline after self-mutating commands run, so the command does not keep firing just because of its own write. If a real external change happens later, it can rerun again.</p>
<h3>6. Keep shell support useful, but intentionally narrow</h3>
<p><code>--shell</code> is there for command-line expressions on Unix-like platforms, not full shell scripting. Today it is meant for cases that need <code>&amp;&amp;</code>, <code>||</code>, or <code>|</code>, plus ordinary redirects handled within the documented boundaries.</p>
<p>That was another intentional choice. I wanted the feature to be helpful without quietly expanding into a much larger, fuzzier surface area.</p>
<h2>Installing <code>with-watch</code></h2>
<p>Right now, the documented install paths are:</p>
<pre><code class="language-sh">cargo install with-watch
brew install delinoio/tap/with-watch
</code></pre>
<p>If you are already comfortable in Rust or Homebrew-based workflows, getting started is very lightweight.</p>
<h2>Why I think this shape matters</h2>
<p>I did not build <code>with-watch</code> to replace every task runner or watcher. I built it for a narrower but very common feeling: "I already have the command I want. I just want it to run again when the right files change."</p>
<p>That is why the tool is centered on delegated commands instead of a new config format.</p>
<p>That is why the API tries to stay close to the command you were already going to run.</p>
<p>That is why I keep coming back to the same idea: the user's input often already contains the watch requirement.</p>
<p>That is why safe inference matters.</p>
<p>That is why <code>exec --input</code> exists.</p>
<p>That is why the delegated command stays unchanged, with only the minimum extra syntax needed when you want to be explicit.</p>
<p>And that is why the tool tries to help without pretending it knows more than it does.</p>
<h2>Try it</h2>
<p>If that workflow sounds familiar, give <code>with-watch</code> a try.</p>
<p>Start with something small like <code>with-watch grep hello input.txt</code>, then move on to a shell expression or an explicit <code>cargo test</code> loop with <code>exec --input</code>. And if you want to see the full recognized command inventory and the exact current CLI shape, check the project documentation or run:</p>
<pre><code class="language-sh">with-watch --help
</code></pre>
<p>That help output is the best place to see what the tool currently recognizes and where it expects you to be explicit.</p>
]]></content:encoded></item><item><title><![CDATA[Delino OSS, as of 2026/03/02]]></title><description><![CDATA[There is definitely a learning angle around vibe coding, but the bigger goal is to build tools the team actually uses every day. You can also browse project docs at oss.delino.io or see code at https:]]></description><link>https://blog.delino.io/delino-oss-2026-03-02</link><guid isPermaLink="true">https://blog.delino.io/delino-oss-2026-03-02</guid><dc:creator><![CDATA[DongYoon Kang]]></dc:creator><pubDate>Mon, 02 Mar 2026 08:37:54 GMT</pubDate><content:encoded><![CDATA[<p>There is definitely a learning angle around vibe coding, but the bigger goal is to build tools the team actually uses every day. You can also browse project docs at <a href="http://oss.delino.io">oss.delino.io</a> or see code at <a href="https://github.com/delinoio/oss">https://github.com/delinoio/oss</a>. Progress notes below reflect the current snapshot as of March 2, 2026.</p>
<h2>1) cargo-mono</h2>
<p><code>cargo-mono</code> is a tool built to make swc release operations safer. It is implemented as a Rust <code>cargo</code> external subcommand that automates <code>changed</code>, <code>bump</code>, and <code>publish</code> workflows, and it has been used in the swc deployment pipeline since March 2, 2026. Current status: Production use.</p>
<h2>2) nodeup</h2>
<p><code>nodeup</code> brings the rustup usage model to Node.js environments as a Rust CLI. From install/remove flows to directory overrides and <code>node/npm/npx</code> dispatching, it is designed to feel familiar to people who already use rustup. Current status: Testing is complete, and release preparation is in progress.</p>
<h2>3) derun</h2>
<p><code>derun</code> is a Go-based CLI built to make AI coding agents much easier to use. Humans run commands normally with <code>derun run</code>, while agents keep context through the MCP stdio server (<code>derun mcp</code>) by reading session output and progress logs. Current status: In testing while also preparing for release.</p>
<h2>4) ttl</h2>
<p><code>ttl</code> is still in a preparatory phase, but the direction is clear. It aims to express a turbo-tasks-style incremental execution model in a TTL language, then compile it with a Go-based <code>ttlc</code> compiler and back it with SQLite caching. Current status: Active development.</p>
<h2>5) devkit</h2>
<p><code>devkit</code> is an internal web platform shell built with Next.js 16 and TypeScript. It is designed to let us attach mini apps quickly under the <code>/apps/&lt;id&gt;</code> convention, and <code>commit-tracker</code>, <code>remote-file-picker</code>, and <code>thenv</code> are already running in practice. Current status: Development is intentionally moving slowly and carefully because we are still getting used to live broadcasting workflows and want to avoid accidental secret leaks.</p>
<h2>6) devkit-commit-tracker</h2>
<p><code>devkit-commit-tracker</code> is a tracking tool built for swc use cases. With a Next.js mini app, Go Connect RPC server/collector, and PostgreSQL, it collects and visualizes commit/PR-level metrics such as final binary size so regressions can be caught early.</p>
<h2>7) devkit-remote-file-picker</h2>
<p><code>devkit-remote-file-picker</code> is a signed-URL upload mini app built with Next.js and TypeScript. It takes local file or mobile camera input, uploads directly to S3/GCS, and safely returns results back to the host app. Conceptually, it is inspired by Android's <code>Intent</code> model and is similar to launching an Activity to receive a result.</p>
<h2>8) thenv</h2>
<p><code>thenv</code> is a secure team system for sharing <code>.env</code> and <code>.dev.vars</code>, composed of a Go CLI, a Go Connect RPC server, and a Next.js web console. It is operated around RBAC, versioning, active pointers, audit logs, and server-side encryption. Current status: Development is intentionally moving slowly and carefully because we are still getting used to live broadcasting workflows and want to avoid accidental secret leaks.</p>
<h2>9) devmon</h2>
<p><code>devmon</code> is a local automation tool that combines a Go daemon/CLI, a macOS menu bar app, and LaunchAgent integration. Menu bar control is a key part of the workflow, and it is actively used in day-to-day work and even during streaming for tasks like keeping local <code>main</code> synced with remote <code>main</code> or running periodic <code>cargo clean</code> jobs. Current status: Production use.</p>
<h2>10) mpapp</h2>
<p><code>mpapp</code> is a mobile app built with React Native and Expo. Its goal is to let you control an iPhone mounted on a hanger from another smartphone in your hand, without having to raise your hand to the mounted phone itself. Current status: Development is delayed because this workflow requires Android hardware for practical validation.</p>
<h2>11) serde-feather</h2>
<p><code>serde-feather</code> is a derive-macro-focused project for Rust. It is split across a Rust proc-macro crate and a runtime support crate, centered on <code>FeatherSerialize</code> and <code>FeatherDeserialize</code> while keeping binary-size overhead low. Current status: Active development.</p>
<h2>12) dexdex</h2>
<p><code>dexdex</code> is a desktop app that lightly refines the Codex desktop app workflow. With Rust servers and a Tauri client (React/TypeScript + Rust), it keeps familiar UX while making session flow and PR response loops more seamless. Current status: Active development.</p>
<h2>Wrap-up</h2>
<p>The shared theme across this repository is straightforward: define contracts first, keep execution observable, and shape automation for real operations. Even when a project starts from learning, the target is still practical tools that people actually use. For the full contract details, <a href="http://oss.delino.io">oss.delino.io</a> is the fastest way to browse them.</p>
]]></content:encoded></item><item><title><![CDATA[Case Study: The first contribution of DevBird to rspack]]></title><description><![CDATA[When the rspack team needed to migrate their codebase, they tried AI-powered development tools to handle the repetitive work. What started as a performance evaluation turned into a compelling demonstration of DevBird's capabilities, particularly its ...]]></description><link>https://blog.delino.io/2025-10-23-devbird-case-study</link><guid isPermaLink="true">https://blog.delino.io/2025-10-23-devbird-case-study</guid><category><![CDATA[DevBird]]></category><category><![CDATA[Delino]]></category><dc:creator><![CDATA[DongYoon Kang]]></dc:creator><pubDate>Thu, 23 Oct 2025 13:57:07 GMT</pubDate><content:encoded><![CDATA[<p>When the rspack team needed to migrate their codebase, they tried AI-powered development tools to handle the repetitive work. What started as a performance evaluation turned into a compelling demonstration of DevBird's capabilities, particularly its autonomous CI failure fix system.</p>
<h2 id="heading-the-challenge">The Challenge</h2>
<p>The rspack team had a specific migration task to complete across their codebase. It was the kind of systematic change that seems perfect for AI automation: well-defined, repetitive, but requiring attention to detail and context awareness.</p>
<h2 id="heading-initial-attempts">Initial Attempts</h2>
<h3 id="heading-github-copilots-result">GitHub Copilot's Result</h3>
<p>The team first tried GitHub Copilot, which generated a pull request (<a target="_blank" href="https://github.com/web-infra-dev/rspack/pull/11966">#11966</a>). Unfortunately, the results were unsatisfactory—the PR quality didn't meet the team's standards and wasn't viable for merging.</p>
<h3 id="heading-testing-devbird-formerly-autodev">Testing DevBird (formerly AutoDev)</h3>
<p><em>Note: At this time, DevBird was still named AutoDev before our recent rebrand.</em></p>
<p>Interested in evaluating alternative AI coding solutions, the rspack team reached out to test DevBird. I ran DevBird on their behalf by:</p>
<ol>
<li><p>Forking the repository to my personal account</p>
</li>
<li><p>Configuring DevBird for the task</p>
</li>
<li><p>Letting DevBird process the migration</p>
</li>
</ol>
<p>The initial result: <a target="_blank" href="https://github.com/kdy1/rspack/pull/2">PR #2 on the fork</a></p>
<blockquote>
<p>Note: I enabled CompositeTask feature for DevBird on this task and it produced a single-node task graph. If a task is complex enough,DevBird will create multiple PRs. Still, a single-node task graph generates extremely good prompt for the actual run, and it’s the key.</p>
</blockquote>
<h3 id="heading-the-devbird-advantage-autonomous-error-recovery">The DevBird Advantage: Autonomous Error Recovery</h3>
<p>Here's where DevBird's architecture proved its value. Like Codex Cloud Web (which was also tested), DevBird's initial code didn't pass CI on the first attempt. However, <strong>DevBird's automatic PR fix feature detected the CI failure and autonomously corrected the issues</strong>.</p>
<p>After receiving confirmation from the Rspack team member that the PR was "perfect," we submitted it to the main repository: <a target="_blank" href="https://github.com/web-infra-dev/rspack/pull/11978">PR #11978</a></p>
<h3 id="heading-codex-cloud-web-comparison">Codex Cloud Web Comparison</h3>
<p>Codex Cloud Web was also tested on the same task. While it generated initial code, it encountered CI failures. The team member attempted to recover by commenting <code>@codex Fix CI</code>, which triggered Codex to work on the problem for over 40 minutes. Unfortunately, the CI still failed after this extended attempt.</p>
<p>At this point, the team member concluded that further attempts weren't worthwhile and <strong>merged the DevBird-generated PR instead</strong>.</p>
<h2 id="heading-key-takeaways">Key Takeaways</h2>
<h3 id="heading-1-autonomous-recovery-matters">1. <strong>Autonomous Recovery Matters</strong></h3>
<p>The ability to self-correct isn't just a nice-to-have feature—it's essential for production use. Both DevBird and Codex failed CI initially, but DevBird's automatic fix capability meant it could recover without human intervention.</p>
<h3 id="heading-2-time-to-resolution">2. <strong>Time to Resolution</strong></h3>
<ul>
<li><p><strong>DevBird</strong>: Autonomous fix, ready for merge</p>
</li>
<li><p><strong>Codex Cloud Web</strong>: 40+ minutes of attempted fixes, still failed</p>
</li>
<li><p><strong>GitHub Copilot</strong>: Initial PR not viable</p>
</li>
</ul>
<p>The time difference stems from the design differences between these tools. With DevBird, you can use your existing GitHub Actions code to configure the development environment for AI agents, significantly reducing AI costs and the time required to set up the runtime environment.</p>
<h3 id="heading-3-production-ready-results">3. <strong>Production-Ready Results</strong></h3>
<p>The Rspack team's feedback was clear: the DevBird PR was "perfect" and ready for merge. This real-world validation from an active open-source project demonstrates DevBird's capability to handle actual development tasks.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>This case study illustrates a crucial distinction in AI-powered development tools: <strong>generating code is only half the battle</strong>. The ability to iterate, test, and fix issues autonomously is what separates tools that assist developers from tools that can actually complete tasks end-to-end.</p>
<p>DevBird's architecture—with its built-in PR monitoring and automatic fix capabilities—proved essential in delivering production-ready results for the Rspack team. While multiple AI coding tools attempted the same task, only DevBird successfully delivered a mergeable solution.</p>
<hr />
<p><em>Interested in seeing how DevBird can help your team?</em> <a target="_blank" href="http://docs.delino.io/devbird"><em>Get started today</em></a> <em>to learn more about autonomous error recovery and other features.</em></p>
]]></content:encoded></item><item><title><![CDATA[AutoDev is now DevBird]]></title><description><![CDATA[Why the Change?
Since launching AutoDev, we've encountered an unexpected challenge: name overlap with Microsoft's AutoDev has made it difficult for users to find us through search engines. This SEO conflict has created unnecessary friction for our co...]]></description><link>https://blog.delino.io/2025-10-23-autodev-is-now-devbird</link><guid isPermaLink="true">https://blog.delino.io/2025-10-23-autodev-is-now-devbird</guid><category><![CDATA[Delino]]></category><dc:creator><![CDATA[DongYoon Kang]]></dc:creator><pubDate>Thu, 23 Oct 2025 05:18:44 GMT</pubDate><content:encoded><![CDATA[<h2 id="heading-why-the-change">Why the Change?</h2>
<p>Since launching AutoDev, we've encountered an unexpected challenge: name overlap with Microsoft's AutoDev has made it difficult for users to find us through search engines. This SEO conflict has created unnecessary friction for our community as they attempt to discover and access our service.</p>
<p>After careful consideration, we've decided to rebrand to ensure our users can easily find and connect with us.</p>
<h2 id="heading-why-devbird">Why DevBird?</h2>
<p>Our service acts as a bridge between AI development tools and developers—much like a messenger bird delivering essential information. The name <strong>DevBird</strong> perfectly captures this essence:</p>
<ul>
<li><p><strong>Dev</strong> represents our core focus on developers and development tools</p>
</li>
<li><p><strong>Bird</strong> symbolizes our role as a messenger, connecting you with the AI tools you need</p>
</li>
</ul>
<p>Just as birds have served as messengers throughout history, DevBird delivers the power of AI development tools directly to you.</p>
<h2 id="heading-whats-changing-and-whats-not">What's Changing (and What's Not)</h2>
<p><strong>What's changing:</strong></p>
<ul>
<li><p>Our name: AutoDev → DevBird</p>
</li>
<li><p>Our branding and visual identity (rolling out soon)</p>
</li>
</ul>
<p><strong>What's staying the same:</strong></p>
<ul>
<li><p>All features and functionality you rely on</p>
</li>
<li><p>Your account and data</p>
</li>
<li><p>Our commitment to connecting developers with AI tools</p>
</li>
</ul>
<h2 id="heading-whats-next">What's Next?</h2>
<p>We'll be rolling out our complete rebranding in the coming weeks. You'll see our new logo, updated website, and fresh visual identity—but the powerful service you know and love remains unchanged.</p>
<p>Thank you for being part of our journey. We're excited to soar forward as DevBird!</p>
<hr />
<p><em>Have questions about the rebrand? Feel free to reach out to our team.</em></p>
]]></content:encoded></item><item><title><![CDATA[We are sunsetting Basic plan]]></title><description><![CDATA[We initially created a pay-as-you-go pricing plan with a simple goal in mind: let users pay only for the AI features they actually use. It seemed like the perfect solution for customers who wanted flexibility without committing to a subscription.
The...]]></description><link>https://blog.delino.io/2025-10-16-we-are-sunsetting-basic-plan</link><guid isPermaLink="true">https://blog.delino.io/2025-10-16-we-are-sunsetting-basic-plan</guid><dc:creator><![CDATA[DongYoon Kang]]></dc:creator><pubDate>Thu, 16 Oct 2025 03:58:53 GMT</pubDate><content:encoded><![CDATA[<p>We initially created a pay-as-you-go pricing plan with a simple goal in mind: let users pay only for the AI features they actually use. It seemed like the perfect solution for customers who wanted flexibility without committing to a subscription.</p>
<h2 id="heading-the-problem-we-encountered"><strong>The Problem We Encountered</strong></h2>
<p>Unfortunately, we ran into a significant challenge that made this model unsustainable. The minimum payment processing fees were eating into our margins so severely that we were operating at a loss. Even small transactions meant we were paying disproportionately high fees to payment processors, making it financially unviable to continue offering this option.</p>
<h2 id="heading-moving-forward"><strong>Moving Forward</strong></h2>
<p>After careful consideration, we've made the difficult decision to discontinue the pay-as-you-go plan. While we loved the concept of usage-based pricing, the economics simply don't work with current payment processing infrastructure.</p>
<p>We're exploring alternative pricing models that can offer similar flexibility while being sustainable for our business. We appreciate your understanding as we make these changes.</p>
]]></content:encoded></item><item><title><![CDATA[Introducing AutoDev]]></title><description><![CDATA[We're excited to announce AutoDev, a fully automated development platform that brings the power of vibe coding to your entire team. AutoDev uses AI coding agents and GitHub Actions to handle development tasks end-to-end, from initial code generation ...]]></description><link>https://blog.delino.io/2025-10-15-introducing-autodev</link><guid isPermaLink="true">https://blog.delino.io/2025-10-15-introducing-autodev</guid><category><![CDATA[vibe coding]]></category><category><![CDATA[AI coding]]></category><dc:creator><![CDATA[DongYoon Kang]]></dc:creator><pubDate>Tue, 14 Oct 2025 11:36:37 GMT</pubDate><content:encoded><![CDATA[<p>We're excited to announce AutoDev, a fully automated development platform that brings the power of vibe coding to your entire team. AutoDev uses AI coding agents and GitHub Actions to handle development tasks end-to-end, from initial code generation to automated code reviews and CI fixes.</p>
<h2 id="heading-what-is-the-proper-way-to-do-ai-based-coding">What is the proper way to do AI-based coding?</h2>
<p>Three core principles:</p>
<ol>
<li><p><strong>Breaking work into appropriate units</strong> - Divide complex tasks into manageable, focused pieces</p>
</li>
<li><p><strong>Iterative verification and feedback loops</strong> - Continuously validate work across multiple sessions</p>
</li>
<li><p><strong>Automated regression prevention</strong> - Use CI and automated tests to catch issues early</p>
</li>
</ol>
<p>AutoDev takes vibe coding to the next level with powerful automation and team collaboration features.</p>
<h2 id="heading-why-autodev">Why AutoDev?</h2>
<h3 id="heading-parallel-execution">Parallel Execution</h3>
<p>Unlike traditional AI coding assistants that work sequentially, AutoDev can execute multiple independent tasks simultaneously. When you break down a complex feature into smaller tasks, AutoDev automatically identifies which tasks can run in parallel, dramatically reducing development time.</p>
<h3 id="heading-vm-based-security-you-have-control">VM-Based Security - You Have Control</h3>
<p>Your code runs in your own GitHub Actions runners, not on our servers. You maintain complete control over:</p>
<ul>
<li><p>Your code and intellectual property</p>
</li>
<li><p>Compute resources and costs</p>
</li>
<li><p>Development environment configuration</p>
</li>
</ul>
<h3 id="heading-easy-customization">Easy Customization</h3>
<p>Customize your development environment using GitHub Actions workflows. Simply modify your <code>.github/workflows/autodev.yml</code> file to:</p>
<ul>
<li><p>Install custom tools and dependencies</p>
</li>
<li><p>Configure linters and formatters</p>
</li>
<li><p>Set up your preferred testing frameworks</p>
</li>
<li><p>Add security scanning and compliance checks</p>
</li>
</ul>
<h3 id="heading-transparent-fair-pricing">Transparent, Fair Pricing</h3>
<p><strong>$0.01/workflow execution with a minimum price of $10 per month</strong> - that's it for the platform fee. No per-user charges.</p>
<ul>
<li><p>Team accounts: <strong>$10/month</strong> (regardless of team size, and with per-usage cost)</p>
</li>
<li><p>Personal accounts: <strong>$10/month</strong> (with per-usage cost)</p>
</li>
<li><p>AI costs (Claude, OpenAI, etc.): Pay only for what you use. You can even use your fixed-cost subscription.</p>
</li>
<li><p>GitHub Runner costs: Managed through your GitHub account</p>
</li>
</ul>
<p>This means a team of 10 developers pays the same $10/month as a solo developer - we believe in fair, scalable pricing.</p>
<h2 id="heading-how-it-works">How It Works</h2>
<h3 id="heading-simple-tasks-quick-automation">Simple Tasks - Quick Automation</h3>
<ol>
<li><p><strong>Select your repository</strong> and describe what you want to build</p>
</li>
<li><p><strong>AutoDev triggers your workflow</strong> using GitHub Actions</p>
</li>
<li><p><strong>AI agents create pull requests</strong> with the implementation</p>
</li>
<li><p><strong>Automatic code review handling</strong> - AutoDev responds to feedback and fixes CI failures</p>
</li>
<li><p><strong>Merge the PR when everything is ready</strong></p>
</li>
</ol>
<h3 id="heading-composite-tasks-ai-powered-planning">Composite Tasks - AI-Powered Planning</h3>
<p>For complex features that require multiple coordinated steps, AutoDev can automatically break them down:</p>
<ol>
<li><p><strong>Describe your complex task</strong> in natural language</p>
</li>
<li><p><strong>AI creates a task graph</strong> - A visual breakdown of all necessary steps and their dependencies</p>
</li>
<li><p><strong>Review and approve</strong> the plan (or let auto-approval handle it)</p>
</li>
<li><p><strong>Parallel execution</strong> - Independent tasks run simultaneously</p>
</li>
<li><p><strong>Automatic progression</strong> - As tasks complete, dependent tasks start automatically</p>
</li>
</ol>
<h4 id="heading-example-multi-page-translation-task">Example: Multi-Page Translation Task</h4>
<pre><code class="lang-yaml"><span class="hljs-string">Improve</span> <span class="hljs-string">the</span> <span class="hljs-string">translation</span> <span class="hljs-string">quality</span> <span class="hljs-string">for</span> <span class="hljs-string">each</span> <span class="hljs-string">page</span> <span class="hljs-string">in</span> <span class="hljs-string">AutoDev.</span>

<span class="hljs-string">Create</span> <span class="hljs-string">one</span> <span class="hljs-string">task</span> <span class="hljs-string">per</span> <span class="hljs-string">page.</span> <span class="hljs-string">Each</span> <span class="hljs-string">task</span> <span class="hljs-string">should</span> <span class="hljs-string">handle</span> <span class="hljs-string">a</span> <span class="hljs-string">single</span> <span class="hljs-string">page.</span> 
<span class="hljs-string">If</span> <span class="hljs-string">a</span> <span class="hljs-string">page's</span> <span class="hljs-string">translation</span> <span class="hljs-string">has</span> <span class="hljs-literal">no</span> <span class="hljs-string">issues,</span> <span class="hljs-string">the</span> <span class="hljs-string">task</span> <span class="hljs-string">should</span> <span class="hljs-string">not</span> <span class="hljs-string">create</span> <span class="hljs-string">a</span> <span class="hljs-string">PR.</span>

<span class="hljs-string">Each</span> <span class="hljs-string">task</span> <span class="hljs-string">prompt</span> <span class="hljs-string">must</span> <span class="hljs-string">include</span> <span class="hljs-string">instructions</span> <span class="hljs-string">to</span> <span class="hljs-string">manually</span> <span class="hljs-string">review</span> <span class="hljs-string">and</span> <span class="hljs-string">fix</span> 
<span class="hljs-string">translations</span> <span class="hljs-string">page</span> <span class="hljs-string">by</span> <span class="hljs-string">page</span> <span class="hljs-bullet">-</span> <span class="hljs-string">DO</span> <span class="hljs-string">NOT</span> <span class="hljs-string">use</span> <span class="hljs-string">automated</span> <span class="hljs-string">commands</span> <span class="hljs-string">like</span> <span class="hljs-string">'pnpm translate'</span><span class="hljs-string">.</span> 
<span class="hljs-string">Each</span> <span class="hljs-string">prompt</span> <span class="hljs-string">must</span> <span class="hljs-string">include</span> <span class="hljs-string">the</span> <span class="hljs-string">complete</span> <span class="hljs-string">list</span> <span class="hljs-string">of</span> <span class="hljs-string">all</span> <span class="hljs-string">supported</span> <span class="hljs-string">languages.</span>
</code></pre>
<h4 id="heading-example-security-audit-task">Example: Security Audit Task</h4>
<pre><code class="lang-yaml"><span class="hljs-string">Review</span> <span class="hljs-string">all</span> <span class="hljs-string">RPC</span> <span class="hljs-string">methods</span> <span class="hljs-string">in</span> <span class="hljs-string">AutoDev</span> <span class="hljs-string">and</span> <span class="hljs-string">fix</span> <span class="hljs-string">any</span> <span class="hljs-string">security</span> <span class="hljs-string">issues.</span>

<span class="hljs-string">Create</span> <span class="hljs-string">one</span> <span class="hljs-string">task</span> <span class="hljs-string">per</span> <span class="hljs-string">RPC</span> <span class="hljs-string">method.</span> <span class="hljs-string">Each</span> <span class="hljs-string">task</span> <span class="hljs-string">should</span> <span class="hljs-string">handle</span> <span class="hljs-string">a</span> <span class="hljs-string">single</span> <span class="hljs-string">RPC</span> <span class="hljs-string">method.</span> 
<span class="hljs-string">Each</span> <span class="hljs-string">task</span> <span class="hljs-string">prompt</span> <span class="hljs-string">should</span> <span class="hljs-string">fix</span> <span class="hljs-string">all</span> <span class="hljs-string">security</span> <span class="hljs-string">issues</span> <span class="hljs-string">in</span> <span class="hljs-string">the</span> <span class="hljs-string">RPC,</span> <span class="hljs-string">but</span> <span class="hljs-string">should</span> <span class="hljs-string">NOT</span> 
<span class="hljs-string">create</span> <span class="hljs-string">a</span> <span class="hljs-string">PR</span> <span class="hljs-string">if</span> <span class="hljs-string">the</span> <span class="hljs-string">RPC</span> <span class="hljs-string">already</span> <span class="hljs-string">has</span> <span class="hljs-string">sufficient</span> <span class="hljs-string">test</span> <span class="hljs-string">coverage.</span>
</code></pre>
<h2 id="heading-pro-tips-for-power-users">Pro Tips for Power Users</h2>
<h3 id="heading-intentional-task-separation">Intentional Task Separation</h3>
<p>You can strategically control how work is divided through your prompts. For example, when writing tests for API endpoints:</p>
<p><strong>❌ Don't do this:</strong></p>
<pre><code class="lang-yaml"><span class="hljs-string">Write</span> <span class="hljs-string">tests</span> <span class="hljs-string">for</span> <span class="hljs-string">all</span> <span class="hljs-string">API</span> <span class="hljs-string">endpoints</span>
</code></pre>
<p><strong>✅ Do this instead:</strong></p>
<pre><code class="lang-yaml"><span class="hljs-string">Write</span> <span class="hljs-string">tests</span> <span class="hljs-string">for</span> <span class="hljs-string">all</span> <span class="hljs-string">API</span> <span class="hljs-string">endpoints.</span> <span class="hljs-string">Create</span> <span class="hljs-string">one</span> <span class="hljs-string">task</span> <span class="hljs-string">per</span> <span class="hljs-string">endpoint.</span> 
<span class="hljs-string">Each</span> <span class="hljs-string">task</span> <span class="hljs-string">should</span> <span class="hljs-string">handle</span> <span class="hljs-string">testing</span> <span class="hljs-string">for</span> <span class="hljs-string">a</span> <span class="hljs-string">single</span> <span class="hljs-string">endpoint.</span>
</code></pre>
<p>This approach prevents the common issue where AI coding agents get confused mid-task and start behaving erratically - a problem anyone who's used Claude Code or similar tools for test writing has experienced.</p>
<h3 id="heading-auto-approval-for-trusted-workflows">Auto-Approval for Trusted Workflows</h3>
<p>Enable auto-approval on composite tasks to let AutoDev automatically execute tasks as soon as their dependencies are met. Perfect for:</p>
<ul>
<li><p>Well-defined, repetitive tasks</p>
</li>
<li><p>Tasks with strong CI coverage</p>
</li>
<li><p>Tasks where you trust the AI agent's judgment</p>
</li>
</ul>
<p>You can toggle auto-approval on and off at any time during task execution.</p>
<h2 id="heading-supported-ai-agents">Supported AI Agents</h2>
<p>AutoDev currently supports:</p>
<ul>
<li><p>Claude Code</p>
</li>
<li><p>Codex CLI</p>
</li>
</ul>
<h3 id="heading-coming-soon">Coming Soon</h3>
<ul>
<li><p>Opencode CLI</p>
</li>
<li><p>Gemini CLI</p>
</li>
<li><p>Crush CLI</p>
</li>
<li><p>GitHub Copilot CLI</p>
</li>
</ul>
<h2 id="heading-get-started-today">Get Started Today</h2>
<ul>
<li>Documentation at <a target="_blank" href="https://docs.delino.io/autodev">https://docs.delino.io/autodev</a></li>
</ul>
<ol>
<li><p><strong>Install the AutoDev GitHub App</strong> on your repositories</p>
</li>
<li><p><strong>Create your first task</strong> - Start with something simple</p>
</li>
<li><p><strong>Watch the magic happen</strong> - AutoDev handles everything automatically</p>
</li>
</ol>
<p>Visit <a target="_blank" href="https://app.delino.io/en/autodev/~">AutoDev</a> to start your free trial.</p>
<h2 id="heading-join-the-vibe-coding-revolution">Join the Vibe Coding Revolution</h2>
<p>AutoDev brings professional, scalable AI-assisted development to teams of all sizes. Whether you're a solo developer or managing a large engineering team, AutoDev adapts to your workflow while keeping you in control.</p>
<p><strong>Try AutoDev today and experience the future of automated development.</strong></p>
]]></content:encoded></item></channel></rss>