<?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" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Kunal Kushwaha on Medium]]></title>
        <description><![CDATA[Stories by Kunal Kushwaha on Medium]]></description>
        <link>https://medium.com/@kunalkushwaha?source=rss-192069f1fb7------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*dmvukUCdykqXTg5nC3HUsw.jpeg</url>
            <title>Stories by Kunal Kushwaha on Medium</title>
            <link>https://medium.com/@kunalkushwaha?source=rss-192069f1fb7------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 22 May 2026 19:06:21 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@kunalkushwaha/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Kosh : Your Team’s Memory, Maintained by an LLM]]></title>
            <link>https://medium.com/@kunalkushwaha/kosh-your-teams-memory-maintained-by-an-llm-fb8699716a35?source=rss-192069f1fb7------2</link>
            <guid isPermaLink="false">https://medium.com/p/fb8699716a35</guid>
            <category><![CDATA[data-strategy]]></category>
            <category><![CDATA[knowledge-management]]></category>
            <category><![CDATA[llm-applications]]></category>
            <dc:creator><![CDATA[Kunal Kushwaha]]></dc:creator>
            <pubDate>Wed, 29 Apr 2026 17:02:15 GMT</pubDate>
            <atom:updated>2026-04-30T06:08:54.773Z</atom:updated>
            <content:encoded><![CDATA[<p><em>कोश (kosh) — Hindi for a treasury, storehouse, or collection of knowledge.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zEtd2yW3VIh8lPdWJQ2L0w.png" /></figure><p>Every engineering team has the same problem. Knowledge lives everywhere and nowhere at once — in Slack threads that scroll away, in Notion docs nobody updates, in the heads of people who quit six months ago. When someone asks “why did we pick PostgreSQL over MySQL?” the answer is a 45-minute archaeology expedition through old PRs and Slack history.</p><p>We’ve all tried to fix this. Wikis. Notion. Confluence. Obsidian vaults. The writing is easy. The maintenance is brutal. Pages go stale. Cross-references break. The index becomes a lie. Nobody has time to keep it current, and so slowly, inevitably, it rots.</p><p><strong>Kosh is an attempt to solve the maintenance problem</strong> — by handing it to an LLM.</p><h3>The Core Idea</h3><p>Kosh keeps a structured wiki in <a href="https://obsidian.md">Obsidian</a>. When you feed it a document — a design doc, a meeting note, a post-mortem, an ADR — an LLM doesn’t just summarize it. It <em>integrates</em> it:</p><ul><li>Writes a source summary page</li><li>Creates or updates entity pages (people, systems, teams, products)</li><li>Creates or updates concept pages (ideas, patterns, decisions)</li><li>Flags any contradictions with what the wiki already knows</li><li>Updates the index</li><li>Appends a log entry</li></ul><p>Every piece of knowledge links to every other relevant piece. The wiki is always a single coherent artifact, not a collection of orphaned docs.</p><p>When you ask a question, the LLM reads the relevant pages and synthesizes a cited answer. You can save that answer back to the wiki, where it becomes another page future queries can draw from. <strong>The wiki compounds.</strong> The more you put in, the richer every answer gets — without increasing the cost of asking.</p><h3>Why Obsidian?</h3><p>Obsidian is the right storage layer for a few reasons:</p><p><strong>It’s just files.</strong> Your wiki is markdown on disk. No vendor lock-in, no proprietary format. You can read it, search it, version-control it, and migrate it with cp.</p><p><strong>It has a graph view.</strong> After a few weeks of ingestion, you open Ctrl+G and see the shape of your team&#39;s knowledge — hubs (well-connected ideas), orphans (stubs that need work), clusters (related concepts that might want a parent page). The structure tells you things.</p><p><strong>It has the Local REST API plugin.</strong> This is what makes Kosh possible. Kosh talks to Obsidian over a local HTTP API, reading and writing files without touching the filesystem directly. Each vault runs on its own port; Kosh manages all of them from one server.</p><h3>Multi-Team, Multi-Vault</h3><p>Kosh is designed for a real team, not a single user.</p><p>Each functional team gets its own Obsidian vault. Engineering gets engineering. Strategy gets strategy. The CTO team can edit the engineering vault but only view strategy. The CEO team admins strategy but can read everything. Access is controlled at the vault level with three roles — vault_admin, editor, viewer — with team defaults and per-user overrides.</p><p>All of this is stored in PostgreSQL. Role changes take effect immediately. Every wiki operation — ingest, query, lint, role change — is recorded in an append-only audit log.</p><h3>LLM Agnostic</h3><p>Kosh doesn’t care which LLM you use. It ships with two adapters:</p><ul><li><strong>Anthropic</strong> — Claude Opus/Sonnet via the native Messages API</li><li><strong>OpenAI-compatible</strong> — covers OpenAI, Gemini, DeepSeek, and <strong>Ollama</strong> (local models, no API key needed)</li></ul><p>Switch providers by changing three lines in .env. The wiki operations — ingest, query, lint — work the same regardless of which model is running them. For teams that want to keep data on-premises, Ollama + a capable local model is a fully supported path.</p><h3>The Developer Workflow</h3><p>The part I’m most excited about is the MCP server.</p><p>Kosh ships a <a href="https://modelcontextprotocol.io">Model Context Protocol</a> server. Add it to Claude Code, Cursor, or VS Code and the wiki becomes a native tool — no context switching, no copy-paste, no manual saving.</p><pre>{<br>  &quot;mcpServers&quot;: {<br>    &quot;kosh&quot;: {<br>      &quot;command&quot;: &quot;/path/to/kosh-mcp&quot;,<br>      &quot;env&quot;: {<br>        &quot;KOSH_SERVER_URL&quot;: &quot;http://your-server:8080&quot;,<br>        &quot;KOSH_API_KEY&quot;: &quot;kosh_...&quot;,<br>        &quot;KOSH_DEFAULT_VAULT&quot;: &quot;engineering&quot;<br>      }<br>    }<br>  }<br>}</pre><p>With this configured and a few lines in your project’s CLAUDE.md:</p><pre>Before answering architecture questions, check the wiki with wiki_query.<br>When you explain a non-obvious design decision, save it with wiki_ingest.</pre><p>Now Claude captures knowledge as a side effect of normal work. A developer asks why the auth middleware works a certain way. Claude queries the wiki, finds the answer, explains it — and if the answer wasn’t there, saves the explanation for next time. <strong>The wiki grows without anyone deciding to maintain it.</strong></p><p>The MCP tools are:</p><ul><li>wiki_query — ask a question, get a cited answer</li><li>wiki_ingest — integrate a document or text block into the wiki</li><li>wiki_ingest_file — ingest a file by path</li><li>wiki_list_pages — browse the wiki structure</li><li>wiki_read_page — read a specific page</li><li>wiki_lint — run a health check</li><li>wiki_list_vaults — see available vaults</li></ul><h3>Lint: Keeping the Wiki Honest</h3><p>Knowledge bases rot not just from neglect but from inconsistency. Two engineers use “service mesh” to mean different things. A concept page references an entity that was renamed six months ago. A decision from 2025 contradicts a decision from 2026 and nobody noticed.</p><p>koshctl lint --vault engineering runs the LLM over your entire wiki and surfaces:</p><ul><li><strong>Orphans</strong> — pages with no incoming links</li><li><strong>Missing pages</strong> — links that point to pages that don’t exist</li><li><strong>Contradictions</strong> — claims that conflict with each other</li><li><strong>Stubs</strong> — pages with insufficient content</li><li><strong>Gaps</strong> — topics mentioned repeatedly but never given their own page</li></ul><p>Run it monthly. Run it before a new hire’s first day. Run it as a pre-release ritual. The wiki stays coherent.</p><h3>What’s Next</h3><p>Kosh today covers the core loop: ingest, query, lint, access control. The roadmap has three areas I want to tackle next:</p><p><strong>Integrations</strong> — a Slack bot (react 📚 to any message to capture it), GitHub webhooks (auto-ingest merged PRs and ADRs), and an Obsidian inbox watcher (drop files into raw/, they get ingested automatically).</p><p><strong>Knowledge quality</strong> — pre-ingest disambiguation for term conflicts, per-team namespace prefixes so two teams’ definitions of “pipeline” don’t collide, and a living wiki schema with koshctl schema suggest to help the schema evolve based on what the wiki actually contains.</p><p><strong>Vault management</strong> — a PATCH /v1/vaults/:vault endpoint so you can rotate an Obsidian API key without delete-and-re-register, and per-operation model routing (LLM_INGEST_MODEL, LLM_QUERY_MODEL) for teams that want a fast cheap model for queries and a capable model for ingestion.</p><h3>Getting Started</h3><pre>git clone https://github.com/kunalkushwaha/kosh<br>cd kosh<br>cp .env.example .env<br># edit .env: set VAULT_ENCRYPTION_KEY, LLM_API_KEY</pre><pre>docker compose up -d postgres<br>go build -o koshctl ./cmd/koshctl<br>./koshctl bootstrap --email you@yourcompany.com --name &quot;Your Name&quot;</pre><p>Full walkthrough: <a href="docs/setup.md">docs/setup.md</a></p><h3>Where the idea came from</h3><p>Two things collided.</p><p>I’ve been taking the <a href="https://em-executive.berkeley.edu/data-strategy">Data Strategy</a> course at UC Berkeley Executive Education. One of its core arguments is that data compounds — organizations that treat knowledge as a managed, evolving asset pull ahead of those that treat it as a byproduct. The course frames this at the enterprise level: pipelines, governance, culture. But the same logic applies to a small team. Knowledge that is captured, connected, and kept current is a strategic asset. Knowledge scattered across Slack and stale docs is just noise.</p><p>Around the same time, Andrej Karpathy shared a <a href="https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f">gist describing the LLM Wiki pattern</a> and a <a href="https://x.com/karpathy/status/2039805659525644595">tweet</a> about it. The idea: instead of RAG (re-deriving answers from raw documents on every query), use an LLM to maintain a persistent, structured wiki. The wiki is the compounding artifact. Every new source enriches it. Every query draws from everything already synthesized.</p><p>Kosh is just what happened when I decided to actually build that for a team.</p><h3>Why Now</h3><p>LLMs are good enough at structured generation that the ingest pipeline is actually reliable. A year ago, asking a model to read a document and emit well-formed JSON with frontmatter, wikilinks, and consistent tags would fail too often to be useful. Today, with the right prompt and a capable model, it works well enough to build a team workflow around.</p><p>The Obsidian Local REST API plugin made the storage layer clean. PostgreSQL made the access control simple. Go made the server fast to write and easy to deploy.</p><p>The pieces were all there. Kosh is just the assembly.</p><p>Kosh is MIT licensed. The code is at <a href="https://github.com/kunalkushwaha/kosh">github.com/kunalkushwaha/kosh</a>. Issues, PRs, and feedback welcome.</p><p>If you build something with it — or try to and hit a wall — I’d like to hear about it.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fb8699716a35" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Stop Flying Blind: End-to-End Tracing for Your MCP Agent with AgenticGoKit]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@kunalkushwaha/stop-flying-blind-end-to-end-tracing-for-your-mcp-agent-with-agenticgokit-cb02d16cfe2f?source=rss-192069f1fb7------2"><img src="https://cdn-images-1.medium.com/max/2600/1*XxyZrtVkB85YDReWRh9m5Q.png" width="2816"></a></p><p class="medium-feed-snippet">You connected your AI agent to external tools via MCP. It works&#x2026; sometimes. But when it breaks, you&#x2019;re left guessing: Was it the LLM? The&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/@kunalkushwaha/stop-flying-blind-end-to-end-tracing-for-your-mcp-agent-with-agenticgokit-cb02d16cfe2f?source=rss-192069f1fb7------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@kunalkushwaha/stop-flying-blind-end-to-end-tracing-for-your-mcp-agent-with-agenticgokit-cb02d16cfe2f?source=rss-192069f1fb7------2</link>
            <guid isPermaLink="false">https://medium.com/p/cb02d16cfe2f</guid>
            <dc:creator><![CDATA[Kunal Kushwaha]]></dc:creator>
            <pubDate>Mon, 13 Apr 2026 03:39:03 GMT</pubDate>
            <atom:updated>2026-04-13T03:39:03.095Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Building Agentic AI Systems in Go: A Production-Ready Approach]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@kunalkushwaha/building-agentic-ai-systems-in-go-a-production-ready-approach-8359211a8cef?source=rss-192069f1fb7------2"><img src="https://cdn-images-1.medium.com/max/2600/1*OgeC4inmn14vFCNW3ZHydw.png" width="2752"></a></p><p class="medium-feed-snippet">If you&#x2019;re a Go developer looking to build intelligent, multi-agent AI systems, you&#x2019;re in for a treat. AgenticGoKit is an open-source&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/@kunalkushwaha/building-agentic-ai-systems-in-go-a-production-ready-approach-8359211a8cef?source=rss-192069f1fb7------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@kunalkushwaha/building-agentic-ai-systems-in-go-a-production-ready-approach-8359211a8cef?source=rss-192069f1fb7------2</link>
            <guid isPermaLink="false">https://medium.com/p/8359211a8cef</guid>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[golang]]></category>
            <dc:creator><![CDATA[Kunal Kushwaha]]></dc:creator>
            <pubDate>Sun, 08 Feb 2026 08:23:28 GMT</pubDate>
            <atom:updated>2026-02-08T08:23:28.561Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[The Hidden LLM Call: Why AgenticGoKit Was 2x Slower]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@kunalkushwaha/the-hidden-llm-call-why-agenticgokit-was-2x-slower-8b1516292310?source=rss-192069f1fb7------2"><img src="https://cdn-images-1.medium.com/max/1536/1*7Er1ImNXQvPIWSnjXeoY1A.png" width="1536"></a></p><p class="medium-feed-snippet">How a hidden continuation loop, a leaky network stack, and pprof helped Go reclaim the fast path.</p><p class="medium-feed-link"><a href="https://medium.com/@kunalkushwaha/the-hidden-llm-call-why-agenticgokit-was-2x-slower-8b1516292310?source=rss-192069f1fb7------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@kunalkushwaha/the-hidden-llm-call-why-agenticgokit-was-2x-slower-8b1516292310?source=rss-192069f1fb7------2</link>
            <guid isPermaLink="false">https://medium.com/p/8b1516292310</guid>
            <dc:creator><![CDATA[Kunal Kushwaha]]></dc:creator>
            <pubDate>Sun, 11 Jan 2026 09:41:20 GMT</pubDate>
            <atom:updated>2026-01-11T09:41:20.182Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Announcing v1beta: Production-Ready AI Agents in Go]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@kunalkushwaha/announcing-v1beta-production-ready-ai-agents-in-go-f84731387ff6?source=rss-192069f1fb7------2"><img src="https://cdn-images-1.medium.com/max/1536/0*Af8Ql_PJF3sJOfuU.png" width="1536"></a></p><p class="medium-feed-snippet">TL;DR</p><p class="medium-feed-link"><a href="https://medium.com/@kunalkushwaha/announcing-v1beta-production-ready-ai-agents-in-go-f84731387ff6?source=rss-192069f1fb7------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@kunalkushwaha/announcing-v1beta-production-ready-ai-agents-in-go-f84731387ff6?source=rss-192069f1fb7------2</link>
            <guid isPermaLink="false">https://medium.com/p/f84731387ff6</guid>
            <category><![CDATA[ai-framework]]></category>
            <category><![CDATA[golang]]></category>
            <category><![CDATA[ai-workflow]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <dc:creator><![CDATA[Kunal Kushwaha]]></dc:creator>
            <pubDate>Wed, 24 Dec 2025 18:48:04 GMT</pubDate>
            <atom:updated>2025-12-24T18:48:04.672Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Building AI Agents That Actually Do Things: Tools and MCP Made Simple in Go]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@kunalkushwaha/building-ai-agents-that-actually-do-things-tools-and-mcp-made-simple-in-go-064d83d5a149?source=rss-192069f1fb7------2"><img src="https://cdn-images-1.medium.com/max/1024/0*hPEmqHREHxdCUl6V.png" width="1024"></a></p><p class="medium-feed-snippet">If you&#x2019;re new to building AI agents in Go, you might think integrating tools and external services is complex.</p><p class="medium-feed-link"><a href="https://medium.com/@kunalkushwaha/building-ai-agents-that-actually-do-things-tools-and-mcp-made-simple-in-go-064d83d5a149?source=rss-192069f1fb7------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@kunalkushwaha/building-ai-agents-that-actually-do-things-tools-and-mcp-made-simple-in-go-064d83d5a149?source=rss-192069f1fb7------2</link>
            <guid isPermaLink="false">https://medium.com/p/064d83d5a149</guid>
            <category><![CDATA[mcp-server]]></category>
            <category><![CDATA[agentic-workflow]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[golang]]></category>
            <category><![CDATA[agentic-ai]]></category>
            <dc:creator><![CDATA[Kunal Kushwaha]]></dc:creator>
            <pubDate>Thu, 06 Nov 2025 04:54:25 GMT</pubDate>
            <atom:updated>2025-11-06T04:54:25.779Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Building Context-Aware AI Agents with Memory in AgenticGoKit]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@kunalkushwaha/building-context-aware-ai-agents-with-memory-in-agenticgokit-52c7b9c2af1c?source=rss-192069f1fb7------2"><img src="https://cdn-images-1.medium.com/max/1171/0*DkDHF_9JTHlHXDBS.PNG" width="1171"></a></p><p class="medium-feed-snippet">One of the biggest challenges in building AI agents is making them remember. Users expect conversational agents to recall previous&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/@kunalkushwaha/building-context-aware-ai-agents-with-memory-in-agenticgokit-52c7b9c2af1c?source=rss-192069f1fb7------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@kunalkushwaha/building-context-aware-ai-agents-with-memory-in-agenticgokit-52c7b9c2af1c?source=rss-192069f1fb7------2</link>
            <guid isPermaLink="false">https://medium.com/p/52c7b9c2af1c</guid>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[rags]]></category>
            <category><![CDATA[agentic-workflow]]></category>
            <category><![CDATA[ai-agents-rag]]></category>
            <category><![CDATA[agent-memory]]></category>
            <dc:creator><![CDATA[Kunal Kushwaha]]></dc:creator>
            <pubDate>Tue, 04 Nov 2025 04:08:26 GMT</pubDate>
            <atom:updated>2025-11-04T04:08:26.344Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Streaming AI Responses in Go with AgenticGoKit]]></title>
            <link>https://medium.com/@kunalkushwaha/streaming-ai-responses-in-go-with-agenticgokit-bf2a73b405d0?source=rss-192069f1fb7------2</link>
            <guid isPermaLink="false">https://medium.com/p/bf2a73b405d0</guid>
            <category><![CDATA[agentic-workflow]]></category>
            <category><![CDATA[gen-ai-tools]]></category>
            <category><![CDATA[ai-framework]]></category>
            <category><![CDATA[streaming]]></category>
            <category><![CDATA[golang]]></category>
            <dc:creator><![CDATA[Kunal Kushwaha]]></dc:creator>
            <pubDate>Fri, 31 Oct 2025 15:18:47 GMT</pubDate>
            <atom:updated>2025-10-31T15:27:00.044Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RUfy7GV8CHP9TTz3W36fvQ.jpeg" /></figure><p>Streaming makes AI feel alive — tokens show up instantly, long tasks feel responsive, and multi‑step workflows become explainable as they run. In this post, we’ll build two streaming experiences with <a href="https://github.com/AgenticGoKit/AgenticGoKit">AgenticGoKit</a>:</p><ul><li>A minimal “simple-streaming” chat</li><li>A sequential multi‑agent “streaming_workflow” with step-by-step progress</li></ul><p>We’ll also cover when to use streaming, why it helps, and a few gotchas and tips.</p><p><em>originally posted at : </em><a href="https://kunalkushwaha.github.io/2025/10/26/streaming-agenticgokit/"><em>https://kunalkushwaha.github.io/2025/10/26/streaming-agenticgokit/</em></a></p><h3>What is streaming and why it matters</h3><p>Instead of waiting for the full response, streaming lets you consume output as it’s generated (token‑by‑token or chunk‑by‑chunk). That enables:</p><ul><li>Real‑time feedback: Users see progress immediately</li><li>Better UX for long tasks: No “blank screen” pause</li><li>Step visibility in workflows: Know which agent/step is running</li><li>Early assessment: Skim partial output and course‑correct sooner</li></ul><p>Under the hood, AgenticGoKit vNext exposes a Stream you can iterate over, with multiple chunk types like text deltas, metadata, tool calls, and final completion signals.</p><h3>Prerequisites</h3><ul><li>Go installed and working in this repo</li><li>Ollama running locally (default <a href="http://localhost:11434)">http://localhost:11434)</a></li><li>Model: gemma3:1b</li><li>Repo paths in this post are relative to the project root</li></ul><p>Pull the model if needed:</p><pre>ollama pull gemma3:1b</pre><p>Alternatively, you can use OpenAI or Azure OpenAI instead of Ollama by setting API keys and pointing your agent config to those providers:</p><pre># OpenAI<br>$env:OPENAI_API_KEY = &quot;&lt;your-openai-api-key&gt;&quot;<br><br># Azure OpenAI<br>$env:AZURE_OPENAI_KEY = &quot;&lt;your-azure-openai-key&gt;&quot;<br># Your Azure Base URL typically looks like:<br># https://&lt;your-resource-name&gt;.openai.azure.com/</pre><h3>Part 1: Minimal simple-streaming</h3><p>The example lives here: <a href="https://github.com/AgenticGoKit/AgenticGoKit/blob/master/examples/vnext/simple-streaming/main.go">examples/vnext/simple-streaming/main.go</a>.</p><p>It creates a small chat agent and prints tokens as they arrive:</p><pre>// Start streaming<br>ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)<br>defer cancel()<br><br>stream, err := agent.RunStream(ctx, prompt)<br>if err != nil {<br>    log.Fatalf(&quot;Failed to start streaming: %v&quot;, err)<br>}<br><br>// Print tokens as they arrive<br>for chunk := range stream.Chunks() {<br>    if chunk.Error != nil { fmt.Printf(&quot;\n❌ Error: %v\n&quot;, chunk.Error); break }<br>    switch chunk.Type {<br>    case vnext.ChunkTypeDelta:<br>        fmt.Print(chunk.Delta) // token-by-token<br>    case vnext.ChunkTypeDone:<br>        fmt.Println(&quot;\n\n✅ Streaming completed!&quot;)<br>    }<br>}<br><br>// Always check the final result<br>_, _ = stream.Wait()</pre><p>Run it:</p><pre>cd examples/vnext/simple-streaming<br>go run .</pre><p>You’ll see something like:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*w2D6w63IDN_cR7Q_.gif" /></figure><p>Notes:</p><ul><li>The example uses Ollama with gemma3:1b. Adjust the model/provider in the config if needed.</li><li>Always call stream.Wait() after consuming chunks to surface any trailing errors.</li></ul><h3>Part 2: Multi‑agent streaming workflow</h3><p>Now, let’s level up with a sequential, two‑agent workflow that streams each step in real time. Code: <a href="https://github.com/AgenticGoKit/AgenticGoKit/tree/master/examples/vnext/streaming_workflow/main.go">examples/vnext/streaming_workflow/main.go</a>.</p><p>We’ll create two specialized agents — Researcher and Summarizer — and wire them into a vNext Workflow. Each step streams its own tokens and emits metadata so you know what’s happening.</p><h3>Defining agents</h3><pre>func CreateResearcherAgent() (vnext.Agent, error) {<br>    return vnext.QuickChatAgentWithConfig(&quot;Researcher&quot;, &amp;vnext.Config{<br>        Name:         &quot;researcher&quot;,<br>        SystemPrompt: &quot;You are a Research Agent...&quot;,<br>        Timeout:      60 * time.Second,<br>        LLM: vnext.LLMConfig{ Provider: &quot;ollama&quot;, Model: &quot;gemma3:1b&quot;, Temperature: 0.2, MaxTokens: 300, BaseURL: &quot;http://localhost:11434&quot; },<br>    })<br>}<br><br>func CreateSummarizerAgent() (vnext.Agent, error) {<br>    return vnext.QuickChatAgentWithConfig(&quot;Summarizer&quot;, &amp;vnext.Config{<br>        Name:         &quot;summarizer&quot;,<br>        SystemPrompt: &quot;You are a Summarizer Agent...&quot;,<br>        Timeout:      60 * time.Second,<br>        LLM: vnext.LLMConfig{ Provider: &quot;ollama&quot;, Model: &quot;gemma3:1b&quot;, Temperature: 0.3, MaxTokens: 150, BaseURL: &quot;http://localhost:11434&quot; },<br>    })<br>}</pre><h4>Using OpenAI or Azure OpenAI</h4><p>Where the Ollama LLM config is defined above, you can swap in OpenAI or Azure OpenAI with minimal changes:</p><pre>// OpenAI<br>LLM: vnext.LLMConfig{<br>    Provider: &quot;openai&quot;,<br>    Model:    &quot;gpt-4&quot;,<br>    APIKey:   os.Getenv(&quot;OPENAI_API_KEY&quot;),<br>}<br><br>// Azure OpenAI<br>LLM: vnext.LLMConfig{<br>    Provider: &quot;azure&quot;,<br>    Model:    &quot;gpt-4&quot;,<br>    BaseURL:  &quot;https://your-resource.openai.azure.com/&quot;,<br>    APIKey:   os.Getenv(&quot;AZURE_OPENAI_KEY&quot;),<br>}</pre><p>Notes:</p><ul><li>Keep the rest of the streaming code exactly the same; provider selection is handled via LLMConfig.</li><li>Ensure the appropriate environment variables are set in your shell before running the examples.</li></ul><h3>Building a sequential workflow</h3><pre>workflow, err := vnext.NewSequentialWorkflow(&amp;vnext.WorkflowConfig{ Mode: vnext.Sequential, Timeout: 180 * time.Second })<br>if err != nil { log.Fatal(err) }<br><br>_ = workflow.AddStep(vnext.WorkflowStep{<br>    Name:  &quot;research&quot;,<br>    Agent: researcher,<br>    Transform: func(input string) string {<br>        return fmt.Sprintf(&quot;Research the topic: %s. Provide key information, benefits, and current applications.&quot;, input)<br>    },<br>})<br><br>_ = workflow.AddStep(vnext.WorkflowStep{<br>    Name:  &quot;summarize&quot;,<br>    Agent: summarizer,<br>    Transform: func(input string) string {<br>        return fmt.Sprintf(&quot;Please summarize this research into key points:\n\n%s&quot;, input)<br>    },<br>})</pre><h3>Running with streaming</h3><pre>ctx := context.Background()<br>stream, err := workflow.RunStream(ctx, topic)<br>if err != nil { log.Fatal(err) }<br><br>for chunk := range stream.Chunks() {<br>    switch chunk.Type {<br>    case vnext.ChunkTypeMetadata:<br>        if stepName, ok := chunk.Metadata[&quot;step_name&quot;].(string); ok {<br>            fmt.Printf(&quot;\n🔄 [STEP: %s] %s\n&quot;, strings.ToUpper(stepName), chunk.Content)<br>            fmt.Println(&quot;─────────────────────&quot;)<br>        }<br>    case vnext.ChunkTypeDelta:<br>        fmt.Print(chunk.Delta)<br>    case vnext.ChunkTypeDone:<br>        fmt.Println(&quot;\n✅ Workflow step completed!&quot;)<br>    }<br>}<br><br>result, err := stream.Wait() // final success/error</pre><p>Run it:</p><pre>cd examples/vnext/streaming_workflow<br>go run .</pre><p>What you’ll see:</p><pre>🚀 vnext.Workflow Streaming Showcase<br>====================================<br><br>🔍 Testing Ollama connection...<br>✅ Ollama connection successful<br><br>🌟 vnext.Workflow Sequential Streaming<br>=====================================<br>🎯 Topic: Benefits of streaming in AI applications<br><br>💬 Real-time Workflow Streaming:<br>─────────────────────────────────<br><br>🔄 [STEP: RESEARCH] Step 1/2: research<br>Streaming is a really cool way to access content...<br><br>🔄 [STEP: SUMMARIZE] Step 2/2: summarize<br>Based on the research findings, here are the key points:<br><br>🎉 vnext.WORKFLOW STREAMING COMPLETED!</pre><h3>When to use streaming vs. non‑streaming</h3><p>Without streaming:</p><pre>User: &quot;Research AI streaming benefits&quot;<br>System: [Working... 60–90s of silence]<br>System: [Full results appear all at once]</pre><p>With streaming:</p><pre>User: &quot;Research AI streaming benefits&quot;<br>System: 🔄 [STEP: RESEARCH] … tokens stream live …<br>System: 🔄 [STEP: SUMMARIZE] … tokens stream live …<br>System: ✅ Workflow completed</pre><p>Streaming shines when:</p><ul><li>The task takes more than ~1–2 seconds</li><li>You want visibility into multi‑step progress</li><li>You’re building chat UIs or CLIs where responsiveness matters</li></ul><h3>Tips, options, and best practices</h3><ul><li>Always use contexts with timeouts for cancellation:</li></ul><pre>ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)<br>defer cancel()</pre><ul><li>After consuming chunks, call stream.Wait() to catch final errors and access the final result</li><li>Need only text? Use text‑only streaming to reduce noise</li><li>For UIs, include metadata to display current step/agent</li><li>Tune buffer size and flush intervals for your UX/perf needs</li></ul><p>See core/vnext/STREAMING_GUIDE.md for:</p><ul><li>Chunk types (Text, Delta, Thought, ToolCall, ToolResult, Metadata, Error, Done)</li><li>Stream options: buffer size, thoughts/tool calls, metadata, flush interval</li><li>Utilities: CollectStream, PrintStream, StreamToChannel, AsReader</li></ul><h3>Troubleshooting</h3><ul><li>Stream hangs or never finishes: use a context with timeout and ensure you read all chunks</li><li>Missing output: verify you’re handling ChunkTypeDelta (token deltas) and/or ChunkTypeText</li><li>Slow UI updates: try a larger buffer or longer flush interval</li><li>Provider issues: confirm Ollama is running and the model is pulled</li></ul><h3>Wrap‑up</h3><p>You now have two paths:</p><ul><li>Start simple with <a href="https://github.com/AgenticGoKit/AgenticGoKit/tree/master/examples/vnext/streaming-demo">examples/vnext/simple-streaming</a> to understand token streaming</li><li>Build richer, explainable systems with <a href="https://github.com/AgenticGoKit/AgenticGoKit/tree/master/examples/vnext/streaming_workflow">examples/vnext/streaming_workflow</a></li></ul><p>Both rely on the same Stream primitives, so once you’re comfortable with one, the other feels natural.</p><p><strong>Contribute to AgenticGoKit</strong><br><a href="https://github.com/AgenticGoKit/AgenticGoKit">AgenticGoKit</a> is an open-source Go framework for building, orchestrating, and deploying intelligent agents LLM-agnostic, event-driven, and production-ready.</p><p>Join us to add LLM providers, improve docs, build new agent workflows, fix bugs, or enhance code quality.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bf2a73b405d0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Build a RAG-Powered Multi-Agent AI System in 5 Minutes with AgenticGoKit]]></title>
            <link>https://medium.com/@kunalkushwaha/build-a-rag-powered-multi-agent-ai-system-in-5-minutes-with-agenticgokit-f4aae6fca206?source=rss-192069f1fb7------2</link>
            <guid isPermaLink="false">https://medium.com/p/f4aae6fca206</guid>
            <category><![CDATA[agentic-ai]]></category>
            <category><![CDATA[agentic-rag]]></category>
            <category><![CDATA[openai]]></category>
            <category><![CDATA[rags]]></category>
            <category><![CDATA[opensource-ai]]></category>
            <dc:creator><![CDATA[Kunal Kushwaha]]></dc:creator>
            <pubDate>Sat, 06 Sep 2025 15:33:46 GMT</pubDate>
            <atom:updated>2025-09-07T00:35:27.494Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Transform your AI applications with knowledge-aware agents that can access, reason over, and cite real-time information</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Avm9nT4gCl3N8WUyqBUdww.jpeg" /></figure><p><strong>Introduction</strong></p><p>Building intelligent AI systems that can access and reason over vast amounts of information has traditionally been complex and time-consuming. What if you could create a production-ready RAG (Retrieval-Augmented Generation) system with multiple AI agents in just a few minutes?</p><p>In this tutorial, we’ll walk through building a complete RAG-powered multi-agent system using <strong>AgenticGoKit</strong>, a powerful Go framework that simplifies the creation of sophisticated AI applications.</p><p><strong>Who This Guide Is For</strong></p><ul><li><strong>New Developers</strong>: Get started with AI agent development</li><li><strong>AI Enthusiasts</strong>: Learn about RAG and multi-agent systems</li><li><strong>Go Developers</strong>: Leverage Go’s power for AI applications</li><li><strong>Anyone</strong>: Interested in building knowledge-aware AI systems</li></ul><p><strong>What We’ll Build</strong></p><p>By the end of this tutorial, you’ll have:</p><p>1. A <strong>multi-agent AI system</strong> with 3 collaborative agents</p><p>2. A <strong>vector database</strong> (PostgreSQL + pgvector) for knowledge storage</p><p>3. <strong>Document ingestion pipeline</strong> that automatically chunks and embeds content</p><p>4. <strong>RAG-powered responses</strong> that cite sources from your knowledge base</p><p>5. <strong>CLI tools</strong> for managing your knowledge base</p><p><strong>Prerequisites</strong></p><ul><li><strong>Go 1.21+</strong> installed</li><li><strong>Docker Desktop</strong> for the database</li><li><strong>OpenAI API key</strong> (or Ollama for local models)</li><li><strong>5 minutes</strong> of your time!</li></ul><p><strong>Step 1: Install AgenticGoKit CLI</strong></p><p>First, let’s install the AgenticGoKit command-line interface:</p><pre>$ go install github.com/kunalkushwaha/agenticgokit/cmd/agentcli@latest</pre><p>Verify the installation:</p><pre>$ agentcli version</pre><p><strong>Step 2: Create Your RAG Project</strong></p><p>AgenticGoKit comes with pre-built templates for common use cases. Let’s create a RAG system:</p><pre>$ agentcli create knowledge-assistant -template rag-system<br>$ cd knowledge-assistant</pre><p>This creates a complete project structure:</p><pre>knowledge-assistant/<br>├── agentflow.toml          # Configuration file<br>├── main.go                 # Application entry point<br>├── agents/                 # Agent implementations<br>├── docker-compose.yml      # PostgreSQL + pgvector setup<br>├── setup.bat/setup.sh      # Database setup scripts<br>└── documents/              # Your knowledge base files</pre><p><strong>Step 3: Start the Vector Database</strong></p><p>The template includes a pre-configured PostgreSQL database with pgvector extension:</p><pre># On Windows<br>$ ./setup.bat<br><br># On Linux/Mac<br>$ ./setup.sh</pre><p>This starts a PostgreSQL container with:</p><ul><li><strong>pgvector extension</strong> for vector similarity search</li><li><strong>Pre-configured database</strong> named `agentflow`</li><li><strong>Automatic initialization</strong> with required tables</li></ul><p><strong>Step 4: Configure Your API Key</strong></p><p>Set your OpenAI API key (or skip this step if using Ollama):</p><pre># Windows PowerShell<br>$env:OPENAI_API_KEY=&quot;your-api-key-here&quot;<br># Linux/Mac<br>export OPENAI_API_KEY=&quot;your-api-key-here&quot;</pre><p><strong>Step 5: Add Knowledge to Your System</strong></p><p>Now comes the exciting part! Let’s add some knowledge to our system. Create some sample documents:</p><pre>mkdir documents<br># Create `documents/ai-fundamentals.md`<br># Create `documents/multi-agent-systems.md`<br><br></pre><p><strong>Step 6: Upload Documents to Knowledge Base</strong></p><p>Use AgenticGoKit’s built-in knowledge management commands:</p><pre>$ agentcli knowledge upload ./documents/ - recursive - tags &quot;ai,tutorial,fundamentals&quot;</pre><p>You’ll see detailed output showing:</p><p>- <strong>Document processing</strong> and chunking</p><p>- <strong>Embedding generation</strong> using OpenAI</p><p>- <strong>Vector storage</strong> in PostgreSQL</p><p>- <strong>Automatic tagging</strong> and metadata extraction</p><p><strong>Step 7: Test Knowledge Retrieval</strong></p><p>Let’s verify our knowledge base is working:</p><pre># List all documents<br>agentcli knowledge list<br># Search for specific topics<br>agentcli knowledge search &quot;What is machine learning?&quot;<br># Show knowledge base statistics<br>agentcli knowledge stats</pre><p><strong>Step 8: Test Your RAG System</strong></p><p>Now let’s test the complete RAG system:</p><pre>$ go run . -m &quot;What are the different types of machine learning?&quot;</pre><p>You should see output like:</p><pre>=== Agent Responses ===<br>Agent agent1 (Step 1):<br>Based on the knowledge base, there are three main types of machine learning:<br>1. **Supervised Learning**: This involves training AI models with labeled data,<br>where the system learns from input-output examples.<br>2. **Unsupervised Learning**: This approach focuses on finding patterns in<br>unlabeled data without specific target outputs.<br>3. **Reinforcement Learning**: This method involves learning through trial and<br>error, where agents learn optimal actions through rewards and penalties.<br>These approaches form the foundation of modern AI systems and can be combined<br>for more sophisticated applications.<br>Sources: documents/ai-fundamentals.md<br>Completed at: 14:32:15<br>Summary: 1 agents completed successfully<br></pre><p><strong>Step 9: Experiment with Different Orchestration Modes</strong></p><p>The beauty of AgenticGoKit is its flexibility. Let’s try different agent orchestration patterns by modifying `agentflow.toml`:</p><p><strong>Sequential Mode (Default)</strong></p><pre>[orchestration]<br>mode = &quot;sequential&quot;<br>sequential_agents = [&quot;agent1&quot;, &quot;agent2&quot;, &quot;agent3&quot;]</pre><p>Test it:</p><pre>$ go run . -m &quot;Explain multi-agent systems and their benefits&quot;</pre><p><strong>Collaborative Mode</strong></p><pre>[orchestration]<br>mode = &quot;collaborative&quot;<br>collaborative_agents = [&quot;agent1&quot;, &quot;agent2&quot;, &quot;agent3&quot;]</pre><p><strong>Maintenance Commands</strong></p><pre># Validate knowledge base health<br>$ agentcli knowledge validate<br># Clear specific documents<br>$ agentcli knowledge clear -source &quot;old-docs/&quot;<br># Interactive clearing with confirmation<br>$ agentcli knowledge clear -interactive</pre><p><strong>Understanding the Configuration</strong></p><p>Let’s examine the key configuration in `agentflow.toml`:</p><pre># Memory and RAG Configuration<br>[agent_memory]<br>provider = &quot;pgvector&quot;<br>connection = &quot;postgres://user:password@localhost:15432/agentflow?sslmode=disable&quot;<br>enable_rag = true<br>chunk_size = 1000<br>chunk_overlap = 100<br>knowledge_score_threshold = 0.7<br># Embedding Configuration<br>[agent_memory.embedding]<br>provider = &quot;openai&quot;<br>model = &quot;text-embedding-3-small&quot;<br>cache_embeddings = true<br># Agent Configuration<br>[agents.agent1]<br>role = &quot;agent1&quot;<br>description = &quot;Collaborative agent with RAG capabilities&quot;<br>system_prompt = &quot;You are a helpful AI assistant with access to a knowledge base. Always cite sources when using retrieved information.&quot;<br>capabilities = [&quot;analysis&quot;, &quot;text_analysis&quot;, &quot;data_processing&quot;]<br>enabled = true</pre><p><strong>Key Features Demonstrated</strong></p><p><strong>1. Document Chunking</strong></p><ul><li>Automatic text splitting with configurable chunk size</li><li>Overlap handling to maintain context</li><li>Metadata preservation</li></ul><p><strong>2. Vector Embeddings</strong></p><ul><li>OpenAI text-embedding-3-small integration</li><li>Automatic embedding generation and caching</li><li>Efficient similarity search</li></ul><p><strong>3. Multi-Agent Orchestration</strong></p><ul><li>Sequential, collaborative, and parallel modes</li><li>Agent specialization and coordination</li><li>Configurable workflows</li></ul><p><strong>4. Knowledge Management</strong></p><ul><li>CLI-based document upload and management</li><li>Search with filtering and thresholds</li><li>Statistics and health monitoring</li></ul><p><strong>5. RAG Integration</strong></p><ul><li>Automatic context retrieval for agent queries</li><li>Source attribution in responses</li><li>Configurable relevance thresholds</li></ul><h3>Conclusion</h3><p>In just 5 minutes, we’ve built a sophisticated RAG-powered multi-agent system that demonstrates the power of modern AI development. But this is just the beginning!</p><h3>What We Accomplished</h3><ul><li><strong>Complete RAG System</strong> with vector database and knowledge management</li><li><strong>Multi-Agent Orchestration</strong> with configurable collaboration patterns</li><li><strong>Production-Ready Setup</strong> with monitoring and CLI tools</li><li><strong>Extensible Architecture</strong> ready for your custom requirements</li></ul><h3>The Real Magic</h3><p>AgenticGoKit removes the complexity barrier that has traditionally made advanced AI systems accessible only to large teams with specialized expertise. Now, any developer can build sophisticated AI applications in minutes, not months.</p><h3>Your Next Adventure Awaits</h3><p>The <a href="https://github.com/kunalkushwaha/AgenticGoKit"><strong>AgenticGoKit GitHub repository</strong></a> is packed with examples, documentation, and a growing community of developers building the future of AI applications.</p><p><strong>Don’t just read about it — dive in and start building!</strong></p><p><em>🌟 Found this helpful? Give the </em><a href="https://github.com/kunalkushwaha/AgenticGoKit"><em>AgenticGoKit repo</em></a><em> a star and join the community of developers transforming how we build AI systems!</em></p><h3>Start Your Next Project Today</h3><pre># Pick a template and start building<br>$ agentcli template list<br>$ agentcli create my-next-ai-project --template &lt;your-choice&gt;<br>$ cd my-next-ai-project<br>$ go run . -m &quot;Hello, intelligent world!&quot;</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f4aae6fca206" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why I Built My Own Collaborative Business Model Canvas Tool]]></title>
            <link>https://medium.com/@kunalkushwaha/why-i-built-my-own-collaborative-business-model-canvas-tool-872d170096a1?source=rss-192069f1fb7------2</link>
            <guid isPermaLink="false">https://medium.com/p/872d170096a1</guid>
            <category><![CDATA[bussiness-idea]]></category>
            <category><![CDATA[business-model-canvas]]></category>
            <category><![CDATA[vibe-coding]]></category>
            <dc:creator><![CDATA[Kunal Kushwaha]]></dc:creator>
            <pubDate>Thu, 21 Aug 2025 08:32:42 GMT</pubDate>
            <atom:updated>2025-08-21T08:32:42.242Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*u3NMyQb6CnwRFF1Cg3mfrQ.png" /><figcaption><a href="https://canvasly.plankei.com/">https://canvasly.plankei.com/</a></figcaption></figure><p>When I started my <a href="https://em-executive.berkeley.edu/chief-technology-officer"><strong>CTO program at Berkeley in June 2025</strong></a>, I knew one thing for certain: over the next few months I’d be working on projects that required a lot of <strong>collaboration, iteration, and structure</strong>. One of the frameworks I wanted to use heavily was the <strong>Business Model Canvas (BMC)</strong> — a simple yet powerful way to visualize, test, and refine business ideas.</p><p>The problem?</p><p>I couldn’t find a free, collaborative tool that truly fit my needs.<br> Most tools I tried were either:</p><ul><li>Locked behind paywalls,</li><li>Too clunky and unintuitive for quick brainstorming, or</li><li>Lacking real-time collaboration features.</li></ul><p>And since my team and I will be <strong>co-creating and refining our business models over the next 6–8 months</strong>, I needed something reliable, simple, and collaborative.</p><p>So, instead of compromising, I decided to <strong>build my own.</strong></p><h3>The Birth of Canvasly</h3><p>Armed with <strong>vibe coding</strong> and <strong>Firebase Studio</strong>, I built <strong>Canvasly</strong> — a lightweight web application designed for one purpose:<br> 👉 To make it effortless to <strong>create, edit, and collaborate on Business Model Canvases</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-kr59rFhcvix2JcWxYeM8w.png" /></figure><p>With Canvasly, you and your team can:</p><ul><li>Work together in real-time,</li><li>Save your canvases in the cloud,</li><li>Keep things structured yet flexible for brainstorming.</li></ul><p>It’s simple, minimal, and focused. Exactly what I needed — and hopefully what other entrepreneurs, innovators, and students might find useful too.</p><p>You can try it here: <a href="https://canvasly.plankei.com/">https://canvasly.plankei.com/</a></p><h3>Why I’m Sharing This</h3><p>I didn’t set out to build a product for others. Honestly, Canvasly started as a personal necessity for my own project work at Berkeley. But along the way, I realized that this gap wasn’t just my problem — it’s a common frustration for anyone working on business models in a collaborative environment.</p><p>So, I decided to make it public.</p><p>If you’re a student, entrepreneur, or team looking for a <strong>free, no-friction tool</strong> to collaborate on business models, Canvasly might help you the same way it’s helping me and my team.</p><h3>Looking Ahead</h3><p>This is just the beginning. Over the coming months, I’ll be refining Canvasly as I continue using it for my CTO program projects. Feedback is welcome — if you try it out and have ideas or run into issues, I’d love to hear from you.</p><p>Sometimes, the best tools are born out of personal frustration. Canvasly is one of those stories.</p><p><strong>Try it here</strong>: <a href="https://canvasly.plankei.com/">https://canvasly.plankei.com/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=872d170096a1" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>