<?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[Breatic Engineering]]></title><description><![CDATA[Breatic Engineering]]></description><link>https://breatic.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 07 Nov 2026 10:12:53 GMT</lastBuildDate><atom:link href="https://breatic.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why an AI rewrite should remain a proposal in a collaborative creative workspace]]></title><description><![CDATA[Breatic is a collaborative AI workspace for creative teams: people keep document briefs, references and generated media in a shared project, with an agent…]]></description><link>https://breatic.hashnode.dev/why-an-ai-rewrite-should-remain-a-proposal-in-a-collaborative-creative-workspace</link><guid isPermaLink="true">https://breatic.hashnode.dev/why-an-ai-rewrite-should-remain-a-proposal-in-a-collaborative-creative-workspace</guid><category><![CDATA[React]]></category><category><![CDATA[Collaboration]]></category><dc:creator><![CDATA[Harry Song (ubiquition)]]></dc:creator><pubDate>Mon, 02 Nov 2026 05:45:56 GMT</pubDate><content:encoded><![CDATA[<p>Breatic is a collaborative AI workspace for creative teams: people keep document briefs, references and generated media in a shared project, with an agent assisting the work. I build it, and this article explains one implementation choice in its public code.</p>
<h2>The shared document is not an agent's private scratchpad</h2>
<p>A creative brief is rarely finished when someone asks an agent to improve a paragraph. Another collaborator may still be editing it. The useful question is not just whether the agent can produce better wording, but how that wording enters the work the team already shares.</p>
<p>Automatically treating the model response as the next document state would make generation and editorial approval the same operation. They are not the same thing. A team may want to keep a useful suggestion as a comment, use a different part of it, or decide not to apply it.</p>
<h2>Make the proposed edit inspectable</h2>
<p>Breatic's document proposal card receives a structured proposal rather than merely displaying an opaque chat reply. For rewrite proposals, the component parses the proposed body with the document schema and computes a word-level diff against the proposal's original text. Removed words and added words are rendered separately.</p>
<p>The card also identifies the document and location. Its actions include locating that place, adding an eligible proposal as a comment, and applying a rewrite or insertion. The UI distinguishes work in progress from an applied result.</p>
<p>These are deliberately separate affordances. Seeing an agent's text is not the same as asking it to write into the shared document. A visible diff helps a person evaluate the change; an explicit action expresses the decision to use it.</p>
<p><a href="https://github.com/orime-org/breatic/blob/8eaa0da9888cc6a1a8967b98faaa3e8b80f4e91d/packages/web/src/pages/project/chat/DocumentProposalCard.tsx">Read the proposal-card component</a>.</p>
<h2>Keep synchronization and editorial intent separate</h2>
<p>Breatic uses Yjs/Hocuspocus for collaboration and React Flow for its canvas. A CRDT is valuable for shared editing, but convergence alone cannot tell a team whether an agent's suggestion is appropriate after the surrounding work changes. That requires application behavior and user-facing decisions.</p>
<p>In the proposal card, the displayed state is re-read when the document version or card state changes. This is a useful implementation detail to inspect; it is not a claim that every stale-proposal or concurrent-edit case has been solved. Readers evaluating their own editor should test what happens when a teammate edits the target while a proposal is pending, when the target is removed, and when someone revisits an applied proposal.</p>
<h2>Documents and canvases belong to the same project</h2>
<p>The intended workflow is straightforward: write a brief in a Document Space, keep reference material and visual iterations in Canvas Spaces, and use the project's agent to help refine the work. People retain the choice of what becomes part of the project.</p>
<p>This is also why the repository is useful beyond a screenshot of an AI feature: developers can inspect how the application connects collaborative editing, canvas interactions and reviewable agent operations.</p>
<p><a href="https://github.com/orime-org/breatic">Repository</a><a href="https://github.com/orime-org/breatic/blob/8eaa0da9888cc6a1a8967b98faaa3e8b80f4e91d/docs/USAGE.md">Usage guide</a><a href="https://github.com/orime-org/breatic/blob/8eaa0da9888cc6a1a8967b98faaa3e8b80f4e91d/self-host/DEVELOPMENT.md">Development setup</a></p>
<h2>Deployment and contribution scope</h2>
<p>License update (2026-11-03): the current main branch uses Elastic License 2.0 (Elastic-2.0), replacing the earlier Breatic Source-Available License. It is source-available; personal and organizational internal use, including business use, is permitted under its terms. Providing third parties with a hosted or managed service exposing substantial software functionality is prohibited. See the <a href="https://github.com/orime-org/breatic/blob/main/LICENSE">current LICENSE</a> for the full conditions. Running the application still requires Cloudflare R2 and model services to be configured separately; public source does not make those services free or offline.</p>
<p>Feedback and contributions around collaborative editor/canvas interactions and setup documentation are welcome. This article is based on the public source at commit 8eaa0da9888cc6a1a8967b98faaa3e8b80f4e91d, not a new performance benchmark or independent deployment test. It was prepared with AI assistance and reviewed before publication.</p>
]]></content:encoded></item></channel></rss>