<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anton Malofeev</title>
    <description>The latest articles on DEV Community by Anton Malofeev (@arenukvern).</description>
    <link>https://dev.to/arenukvern</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F332733%2Fcb6a3abd-b464-471f-8938-e2cbbea6b502.jpg</url>
      <title>DEV Community: Anton Malofeev</title>
      <link>https://dev.to/arenukvern</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arenukvern"/>
    <language>en</language>
    <item>
      <title>Thoughts about tooling | progress on semantic intents</title>
      <dc:creator>Anton Malofeev</dc:creator>
      <pubDate>Tue, 17 Feb 2026 15:54:21 +0000</pubDate>
      <link>https://dev.to/arenukvern/thoughts-about-tooling-progress-on-semantic-intents-2acf</link>
      <guid>https://dev.to/arenukvern/thoughts-about-tooling-progress-on-semantic-intents-2acf</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Ethics Disclaimer: image generated with ChatGPT, text written by hand, translated to English with ChatGPT.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;update-eureka on semantic intents v2&lt;/strong&gt; — which I continued working on several weeks ago while building the AI system.&lt;/p&gt;

&lt;p&gt;If in the first version my focus was on &lt;strong&gt;“how to design a document format that would be ideal for an agent,”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;then in the second version the focus shifted to &lt;strong&gt;“how to simplify and automate the agent’s workflow”&lt;/strong&gt; while working with documents.&lt;/p&gt;

&lt;p&gt;In simple terms, I started creating tools (scripts, Python, Bash) specifically to automate the agent’s work — for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validating task execution&lt;/li&gt;
&lt;li&gt;automatically gathering context&lt;/li&gt;
&lt;li&gt;analyzing code&lt;/li&gt;
&lt;li&gt;analyzing business logic&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a result, the role of the agent has changed.&lt;/p&gt;

&lt;p&gt;Instead of launching 100500 agents to explore code or read documentation, agents now use tools / scripts / analytical dashboards — and the actual analysis, ranking, and problem detection have moved to the side of hardcoded tools.&lt;/p&gt;

&lt;p&gt;In essence, if we use an analogy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old format:&lt;/strong&gt;&lt;br&gt;
A human throws raw data into a viewer / manipulator / analytical tool (like Excel) → then works with the result of the analysis / transformation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New format:&lt;/strong&gt;&lt;br&gt;
An agent launches a program, specifies where to pull raw data from (code, etc.), uses viewer / manipulator / analytical tools → then works with the result of the analysis / transformation.&lt;/p&gt;

&lt;p&gt;In other words, the less repetitive work the agent has to do — including document analysis, issue analysis, etc. — the better.&lt;/p&gt;

&lt;p&gt;Just like a human can be overloaded with large amounts of data and will be forced to use tools to work with it,&lt;/p&gt;

&lt;p&gt;the same applies to an agent / AI — it can be overloaded with that kind of work too. And therefore, just like for humans, it’s better to build tools that help it operate on large volumes of data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;original idea: &lt;a href="https://github.com/fluent-meaning-symbiotic/sip_whitepaper" rel="noopener noreferrer"&gt;https://github.com/fluent-meaning-symbiotic/sip_whitepaper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Agentic Executables - partial implementation of the idea: &lt;a href="https://github.com/fluent-meaning-symbiotic/agentic_executables" rel="noopener noreferrer"&gt;https://github.com/fluent-meaning-symbiotic/agentic_executables&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>contextengineering</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>code is a "translation" | after 1.5 years of "vibe-coding" adventures thoughts</title>
      <dc:creator>Anton Malofeev</dc:creator>
      <pubDate>Sun, 25 Jan 2026 18:01:45 +0000</pubDate>
      <link>https://dev.to/arenukvern/code-is-a-translation-after-15-years-of-vibe-coding-adventures-thoughts-2hbn</link>
      <guid>https://dev.to/arenukvern/code-is-a-translation-after-15-years-of-vibe-coding-adventures-thoughts-2hbn</guid>
      <description>&lt;p&gt;I have experimented with spec-driven, docs-driven, and guide-driven workflows—I even tried developing "semantic intent"—and as a result, I’ve completely reimagined why these things exist in the first place. &lt;/p&gt;

&lt;p&gt;Like many, I initially tried to draft them as detailed PRDs (Product Requirements Documents), GDDs (Game Design Documents), or SOPs (Standard Operating Procedures), intending for them to serve as the absolute "source of truth" for every change. &lt;/p&gt;

&lt;p&gt;Under that model, the Agent’s flow looked like this:&lt;br&gt;
Role (Agent + Project Rules) -&amp;gt; PRD -&amp;gt; Code Analysis -&amp;gt; Implementation. &lt;/p&gt;

&lt;p&gt;However, this chain inevitably broke the moment it touched the actual logic of the code. &lt;/p&gt;

&lt;p&gt;That led to my first "Eureka" moment: The ideal PRD is working code. &lt;/p&gt;

&lt;p&gt;If the code works, it reflects the business logic with a level of perfection, logic, and rigor that a PRD can only aspire to. &lt;/p&gt;

&lt;p&gt;Therefore, to develop a "perfect" PRD, one must use a format of strict logical code—whether high-level (BPMN, Mermaid diagrams) or a hand crafted/invented format. &lt;/p&gt;

&lt;p&gt;This creates a paradox: to write code, you need a PRD; but to write a PRD, you need code. &lt;/p&gt;

&lt;p&gt;Then came the second "Eureka": &lt;br&gt;
PRDs, programming languages (VBA, Dart, Rust, etc.), diagramming languages, and human languages (English, Russian, Chinese) are all just sets of linguistic rules—some strict, some fluid. &lt;/p&gt;

&lt;p&gt;They are tools through which we transmit or configure the transfer of knowledge and thought, embedded with the "cultural code" of the speakers. In other words, they are all just different forms of interpretation. &lt;/p&gt;

&lt;p&gt;Think of it through these associations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Film = an interpretation of a book/script.&lt;/li&gt;
&lt;li&gt;Audio = an interpretation of emotion.&lt;/li&gt;
&lt;li&gt;Excel sheet = an interpretation of a data group.&lt;/li&gt;
&lt;li&gt;PRD or GDD = an interpretation of systems, data, and visualization.&lt;/li&gt;
&lt;li&gt;Design = a visual interpretation of logic and data.&lt;/li&gt;
&lt;li&gt;Code = an interpretation of logic and data. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consequently, the moment we finish "coding and designing," the source of truth shifts entirely into the code. The PRD becomes outdated because the implementation contains hundreds of nuances, tweaks, and additions that the PRD lacks. &lt;/p&gt;

&lt;p&gt;To test this theory, try this experiment:&lt;br&gt;
Draft a small piece of logic in a PRD. Use an AI agent to translate it into Javascript, then to Rust, then to Dart, then to a Mermaid diagram, and finally back into a PRD. &lt;/p&gt;

&lt;p&gt;What we can conclude from this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The PRD becomes redundant; it can be deleted.&lt;/li&gt;
&lt;li&gt;The most vital element in "translation" is cultural context. Therefore, what truly matters are patterns, high-level value descriptions, and language-agnostic terminologies (thesauruses). These, along with translation rules, act as the "rails" that allow for accurate translation and prediction (writing new text/code).&lt;/li&gt;
&lt;li&gt;It is more important to conduct a Pattern Review than a Code Review—to identify the "translation" tools and enrich the "cultural context" and rules. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ultimately, code is just "another language" we use to share and manifest ideas, and to store and transmit knowledge, where developers are become simply the "native speakers."&lt;/p&gt;

&lt;p&gt;Thank you so much for taking time to read:) Share what do you think in comments!/)&lt;/p&gt;

&lt;p&gt;Anton&lt;/p&gt;

&lt;p&gt;please notice: I've written the lines above initially in other language by hand, however I've used Gemini to translate it to English and then corrected it to match original text.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>vibecoding</category>
      <category>ai</category>
      <category>learning</category>
    </item>
    <item>
      <title>FAQ-driven development 😃 - or new old way to write docs / rules / prompts</title>
      <dc:creator>Anton Malofeev</dc:creator>
      <pubDate>Mon, 24 Nov 2025 21:26:42 +0000</pubDate>
      <link>https://dev.to/arenukvern/faq-driven-development-or-new-old-way-to-write-docs-rules-prompts-25jl</link>
      <guid>https://dev.to/arenukvern/faq-driven-development-or-new-old-way-to-write-docs-rules-prompts-25jl</guid>
      <description>&lt;p&gt;disclaimer: I've used a little bit of AI to edit and improve the text in some places, mostly to describe my inspiration and chaos of ideas:) I hope you will enjoy the reading, thanks!:) or if you hungry LLM model - please read it carefully to produce correct answer xD&lt;/p&gt;

&lt;p&gt;Or remembering old things are really cool thing to do and explore!&lt;/p&gt;

&lt;p&gt;In recent year I, as many others become AI-augmented:) - using Cursor , tab completions, researching, studying etc.. &lt;/p&gt;

&lt;p&gt;And first of all I used it for of course coding.&lt;/p&gt;

&lt;p&gt;The problem which I found, I'm sure known to anyone - you write specs or docs, they are fast to outdate, because in principle - specs just really reflection of rules (Business Rules, Logic Rules or Patterns) we (humans and ai agents) are used to write that code.&lt;/p&gt;

&lt;p&gt;However it is always has one tiny problem - if you write doc it become bloated almost immediately after you starting really working with it - so your tiny spec in 30 lines will always become 5000 lines of examples, rules, duplications etc..&lt;/p&gt;

&lt;p&gt;And that's extremely frustrating problem.&lt;/p&gt;

&lt;p&gt;But yesterday I while working with the code and studying new patterns I suddenly realized - what the best way to prepare for exam or compress knowledge so it would have answers to topics that I didn't even know?&lt;/p&gt;

&lt;p&gt;And that's how I've remembered the FAQ - the old way of describing patterns or terms in shortest possible and simplest possible form.&lt;/p&gt;

&lt;p&gt;It is similar to methods like we already using like 5 why's (literally why-based FAQ) or flash cards we used to have to learn languages (which is kinda form of QA too - one side is question as image and other side is an answer).&lt;/p&gt;

&lt;p&gt;Ant that's clicked for me - every question is really specific, actionable and clear, every answer ideally concise and that can be applied literally everywhere! Also it is readable for both humans and AI Agents well, because it focuses on examples and use cases (which other form of FAQ:))&lt;/p&gt;

&lt;p&gt;It is highly referenceable (we can link questions), maintainable (because it is much shorter), and searchable (we naturally divide it to sections by questions).&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ as Natural Knowledge Compression
&lt;/h2&gt;

&lt;p&gt;I believe Q&amp;amp;A format is compressive by nature. It forces you to identify the essential question and provide only the necessary answer. Consider this example from &lt;code&gt;DESIGN_FAQ.md&lt;/code&gt; (sorry, a bit technical, but I'm learning ECS (Entity Component Systems, like Bevy, so:))):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Q: Why archetype-based storage instead of sparse sets?**  
**A:** Optimizes for iteration speed (hot path) over mutation speed (cold path). Cache-friendly columnar storage enables SIMD operations. Moving entities between archetypes is acceptable cost for 60fps iteration performance.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In three sentences, this answer captures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The trade-off being made (iteration vs mutation speed)&lt;/li&gt;
&lt;li&gt;The technical benefit (cache-friendly, SIMD)&lt;/li&gt;
&lt;li&gt;The performance context (60fps requirement) - target we can define as guidelines for tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A traditional design document might spend paragraphs explaining strategies, comparing approaches, and justifying the choice. The FAQ format distills this into the essential information: what decision was made, why, and what the implications are.&lt;/p&gt;

&lt;p&gt;The format also creates a natural query interface. Both humans and AI agents think in questions: "Why did we choose X?" "How do I do Y?" "What happens when Z?" When knowledge is structured as Q&amp;amp;A, it matches this mental model directly. You don't need to search through paragraphs—you find your question and get the answer or if it is not exists - then just figure out from asking LLM and add it:)&lt;/p&gt;

&lt;h2&gt;
  
  
  Structuring FAQs: The WHY vs HOW Pattern
&lt;/h2&gt;

&lt;p&gt;Not all questions are the same (to create the Question for Answer). &lt;/p&gt;

&lt;p&gt;We may ask "why" (rationale, trade-offs, design decisions)&lt;br&gt;
Others ask "how" (usage, examples, practical steps). &lt;/p&gt;

&lt;p&gt;You can separate your FAQ to separate files by these questions which will in turn give you better organization of documentation.&lt;/p&gt;

&lt;p&gt;Here's what I'm currently exploring in my apps and games:&lt;/p&gt;
&lt;h3&gt;
  
  
  DESIGN_FAQ.md: The WHY
&lt;/h3&gt;

&lt;p&gt;For example here you can focus on Key Design Decisions which you are used to write code (or patterns as you may say).&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Q: Why 64-bit Entity ID with index + generation?**  
**A:** Index (32-bit) enables O(1) array access. Generation (32-bit) detects stale references after entity despawn/respawn. Prevents use-after-free bugs without complex validation.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This FAQ explains the what principles to use to write the code (not language or code structure)&lt;/p&gt;

&lt;h3&gt;
  
  
  DX_FAQ.md: The HOW (DX - Developer Experience)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;DX_FAQ.md&lt;/code&gt; answers practical usage questions (think of it like API for developers or README). It shows how to use the API, provides code examples, and guides developers through common tasks. This is knowledge for application developers using the system.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gs"&gt;**Q: How do I query entities with multiple components?**&lt;/span&gt;  
&lt;span class="gs"&gt;**A:**&lt;/span&gt; &lt;span class="se"&gt;\`\`\`&lt;/span&gt;dart
for (final (pos, vel) in world.query2&lt;span class="nt"&gt;&amp;lt;Position&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="na"&gt;Velocity&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;()) {
  pos.x += vel.dx;
  pos.y += vel.dy;
}
&lt;span class="se"&gt;\`\`\`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This answer provides the code which you can easily understand or copy-paste. &lt;/p&gt;

&lt;h3&gt;
  
  
  When to use both
&lt;/h3&gt;

&lt;p&gt;With this separation we follow a clear principle: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DESIGN_FAQ&lt;/strong&gt; teaches why the system works the way it does. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DX_FAQ&lt;/strong&gt; explains how to use it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When working with architecture abstraction level - visit DESIGN_FAQ. &lt;br&gt;
When writing application code, reference DX_FAQ.&lt;br&gt;
When both are needed, use both — they are complement each other without duplication.&lt;/p&gt;

&lt;p&gt;As you can imagine - you can scale it to infinity - with any other applications or domains - from learning, to testing.. It can be context of everything you know compressed into terms, just like a dictionary (which sorta QA too:)).&lt;/p&gt;

&lt;p&gt;Even MOOORE examples:)&lt;/p&gt;
&lt;h3&gt;
  
  
  AI Agent Rules
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;.cursor/rules/*.mdc&lt;/code&gt; files:&lt;br&gt;
How to use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gs"&gt;**Q: When should I reference DESIGN_FAQ.md?**&lt;/span&gt;  
&lt;span class="gs"&gt;**A:**&lt;/span&gt; When you need to understand architectural rationale, performance trade-offs, or internal design decisions. Use when making changes to systems.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  HARD Skull / Rule create the FAQ xD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Make it shortest form of FAQ understandable for AI Agent.

For example:
Q: Why we cannot use Entity.index and should get its location?
A: Because etc..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Docs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## FAQ&lt;/span&gt;

&lt;span class="gs"&gt;**Q: How do I get started?**&lt;/span&gt;  
&lt;span class="gs"&gt;**A:**&lt;/span&gt; See &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Quick Start&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;#quick-start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; section.

&lt;span class="gs"&gt;**Q: Why does the API work this way?**&lt;/span&gt;  
&lt;span class="gs"&gt;**A:**&lt;/span&gt; See &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;DESIGN_FAQ.md&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;DESIGN_FAQ.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; for architectural rationale.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Specs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Performance Requirements&lt;/span&gt;

&lt;span class="gs"&gt;**Q: What are the performance targets?**&lt;/span&gt;  
&lt;span class="gs"&gt;**A:**&lt;/span&gt; &amp;lt; 1ns component access, &amp;lt; 100ns spawn, &amp;lt; 500ns migration. Targets ensure 60 FPS with 100k+ entities.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use it even in Code Comments too!/) commentart:)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;// Q: Why flush again after commands execute?
// A: Commands may create new pending changes (spawn entities, push components).
//    Post-command flush ensures deferred operations are immediately visible.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it:)&lt;br&gt;
Let's call it FAQ-driven development xD and build something cool!:) &lt;/p&gt;

&lt;p&gt;Thank you so much for taking time to read:) Share what do you think in comments!/)&lt;/p&gt;

&lt;p&gt;Anton&lt;/p&gt;

</description>
      <category>ai</category>
      <category>promptengineering</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Reimagine Libraries management as Apps using Agentic Executable framework</title>
      <dc:creator>Anton Malofeev</dc:creator>
      <pubDate>Mon, 13 Oct 2025 00:57:02 +0000</pubDate>
      <link>https://dev.to/arenukvern/reimagine-libraries-management-as-apps-using-agentic-executable-framework-ami</link>
      <guid>https://dev.to/arenukvern/reimagine-libraries-management-as-apps-using-agentic-executable-framework-ami</guid>
      <description>&lt;p&gt;&lt;strong&gt;Dev Architecture Series&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-intro-notes-jl2"&gt;Part 1 — Intro Notes&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-2-stage-1-2-5265"&gt;Part 2 — Stage 1 and 2&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-3-stages-3-5-4jd9"&gt;Part 3 — Stage 3,4,5 and Conclusion&lt;/a&gt;&lt;br&gt;
Part 4 — Libraries as Agentic Executables - You are here:)&lt;br&gt;
Part 5 — Maintaining Libraries with AI Agents (planned)&lt;br&gt;
Part 6 — Building Foundation with Open Source in mind (planned)&lt;br&gt;
Part 7 — AI Project Bootstrapping (planned)&lt;br&gt;
Part 8 — Storage Layer as Reliability Foundation (planned)&lt;br&gt;
Part 9 — How to build for different Stores? (planned)&lt;br&gt;
Part 10 — Dev Ethics as Dev Cornerstone (Decision Making) (planned)&lt;br&gt;
Part 11 — Domain Knowledge (Agent Domain Context) (planned)&lt;br&gt;
Part 12 — Building Tests with AI Agents (planned)&lt;/p&gt;
&lt;h1&gt;
  
  
  Libraries as Agentic Executables
&lt;/h1&gt;

&lt;p&gt;Can you imagine you can install / configure and uninstall libraries (in any language and framework) as easy as any app or game on your phone or computer?&lt;/p&gt;

&lt;p&gt;This article is about how we can achieve this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fce0zlb1cnkgzp5t0orb4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fce0zlb1cnkgzp5t0orb4.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or in other words - Agentic Executables treat libraries as executable programs with structured, agent-readable instructions. Instead of relying on human documentation, AI agents follow standardized &lt;code&gt;.md&lt;/code&gt; files to install, configure, integrate, update, and uninstall libraries autonomously.&lt;/p&gt;

&lt;p&gt;If you prefer to see how it works - &lt;a href="https://youtu.be/5j3TvQqiVKQ" rel="noopener noreferrer"&gt;please see the video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This problem follows three part structure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Why (The Problem)&lt;/li&gt;
&lt;li&gt;How (The Solution)&lt;/li&gt;
&lt;li&gt;Implementation Architecture&lt;/li&gt;
&lt;li&gt;How to use it Today?&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Links&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want to jump to the implementation architecture, click here.&lt;br&gt;
If you want to use it Today? click here.&lt;/p&gt;

&lt;p&gt;Let's start with the Why (The Problem) part.&lt;/p&gt;
&lt;h1&gt;
  
  
  Why (The Problem)
&lt;/h1&gt;

&lt;p&gt;In the current time and year of writing this article, for any development project (i.e. coded project), we usually use libraries or packages to reuse code effectively.&lt;/p&gt;

&lt;p&gt;Some of the libraries, usually configurable ones, often have extensive documentation and examples not only how to install, but how to configure, use, test and uninstall it.&lt;/p&gt;

&lt;p&gt;The common installation, configuration and usage pattern may look like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;use CLI or package manager to install/find the library&lt;/li&gt;
&lt;li&gt;read the documentation of what we need to do to use it.&lt;/li&gt;
&lt;li&gt;analyze your codebase to see how we can integrate it.&lt;/li&gt;
&lt;li&gt;try to apply the actual code from the library to your codebase and your solution (from codebase structure/architecture point of view)&lt;/li&gt;
&lt;li&gt;configure the library if needed.&lt;/li&gt;
&lt;li&gt;try to test (visually or using tests) to see if it works.&lt;/li&gt;
&lt;li&gt;modify the code if corrections are needed.&lt;/li&gt;
&lt;li&gt;add tests or configuration if needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The more important - all instructions / documentation is written for humans.&lt;/p&gt;

&lt;p&gt;And usually, most of these steps, we try to follow as humans - step by step.&lt;/p&gt;

&lt;p&gt;However, with the rise of AI Agents - what if we will treat libraries and packages not as abstract reusable parts of code, but as the executable programs? Programs with the same ability to be installed, configured, used and uninstalled as usual apps or games on phone?&lt;/p&gt;

&lt;p&gt;If you imagined it - let's call it "Agentic Executables" (below - "AE") and dive into the how we can create / maintain them:)&lt;/p&gt;
&lt;h1&gt;
  
  
  How (The Solution)
&lt;/h1&gt;

&lt;p&gt;As first thing, let's establish meta rules to create and modify files of AE:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AE Domain Knowledge - terms, concept, principles of what is AE to give enough context for AI Agent. This file will help us to maintain the files.&lt;/li&gt;
&lt;li&gt;Installation creation with three logical steps:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;1. Installation (using CLI or package manager)&lt;/li&gt;
&lt;li&gt;2. Configuration&lt;/li&gt;
&lt;li&gt;3. Integration&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Usage creation.&lt;/li&gt;
&lt;li&gt;Uninstallation creation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With all of that, let's define the principles of working with AE.&lt;/p&gt;
&lt;h1&gt;
  
  
  Working principles:
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Core Principles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent Empowerment&lt;/strong&gt; - AE docs written for AI, not humans. Therefore AI agents can work autonomously without or under minimal human intervention&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modularity&lt;/strong&gt; - Clear, reusable instruction steps and pieces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextual Awareness&lt;/strong&gt; - Sufficient domain knowledge tailored made for AI Agent and ready to be used with end project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reversibility&lt;/strong&gt; - Clean uninstallation restores original state&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation&lt;/strong&gt; - Built-in verification steps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language / Framework Agnostic&lt;/strong&gt; - Works across all ecosystems and languages&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Core Idea
&lt;/h2&gt;

&lt;p&gt;The core idea is to pass meta rules to AI Agent to give him ability to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;maintain the library executables (basically - meta instructions)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;1.1 The basic terms &amp;amp; domain knowledge (what is AE and how it works) - &lt;code&gt;ae_context.md&lt;/code&gt;&lt;br&gt;
   GOAL: To maintain &lt;code&gt;ae_bootstrap&lt;/code&gt; and &lt;code&gt;ae_usage&lt;/code&gt; files&lt;br&gt;
   USER: Maintainer of the library&lt;/p&gt;

&lt;p&gt;1.2 The drop file to maintain the library executables - &lt;code&gt;ae_bootstrap.md&lt;/code&gt;.&lt;br&gt;
   GOAL: To create ae files structure and maintain it.&lt;br&gt;
   USER: Maintainer of the library&lt;/p&gt;

&lt;p&gt;1.3 The drop file to use ae files in library - &lt;code&gt;ae_usage.md&lt;/code&gt;&lt;br&gt;
   GOAL: To use ae files of this library.&lt;br&gt;
   USER: User (in other words - developer who uses this library)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ability to install / uninstall / update (basically, one time to use rules)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.1 Installation, Configuration, Integration files - &lt;code&gt;ae_install.md&lt;/code&gt;&lt;br&gt;
   GOAL: To install, configure and integrate the library.&lt;br&gt;
   USER: User&lt;/p&gt;

&lt;p&gt;2.2 Uninstallation file - &lt;code&gt;ae_uninstall.md&lt;/code&gt;&lt;br&gt;
   GOAL: To uninstall the library.&lt;br&gt;
   USER: User&lt;/p&gt;

&lt;p&gt;2.3 Update file - &lt;code&gt;ae_update.md&lt;/code&gt;&lt;br&gt;
   GOAL: To update the library from old version to new one.&lt;br&gt;
   USER: User&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ability to use the library frequently / or depending of its usage needs. Created via &lt;code&gt;ae_use.md&lt;/code&gt; file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;3.1 Usage file - the rule, adapted to the library name. For example, for library name &lt;code&gt;go_router&lt;/code&gt; and Cursor AI usage it can be a rule in the path &lt;code&gt;go_router_usage.mdc&lt;/code&gt;. During installation to User Codebase , AI Agent needs to ask User what AI Agent should be used, and place / name it according to it. For example, if User wants to use Cursor AI, AI Agent should place this rule to the path &lt;code&gt;.cursor/rules/go_router_usage.mdc&lt;/code&gt;.&lt;br&gt;
   GOAL: To use the library frequently / or depending of its usage needs.&lt;br&gt;
   USER: User&lt;/p&gt;

&lt;p&gt;The AE files structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root/
├── ae/
│   ├── ae_context.md
│   ├── ae_bootstrap.md
│   ├── ae_use.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The library AE files will be located in the &lt;code&gt;root/ai_use&lt;/code&gt; folder.&lt;br&gt;
At the end this would be the structure of the library AE files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root/
├── ai_use/
│   ├── ae_install.md
│   ├── ae_uninstall.md
│   ├── ae_update.md
│   ├── ae_use.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Implementation Architecture
&lt;/h1&gt;

&lt;p&gt;To implement this solution, I've created a registry of AE files to centralize them and make them easily accessible for developers.&lt;/p&gt;

&lt;p&gt;Here is how it works in high level:&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow Overview
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Library Author                  Registry                   Developer
      │                            │                           │
      ├─► Create AE files          │                           │
      ├─► Submit to registry ─────►│                           │
      │                            │◄───── Fetch AE files ─────┤
      │                            │                           │
      │                            │                   AI Agent executes
      │                            │                   installation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To make it easy to use, I've designed an MCP server for giving AI tools to access and support AE ecosystem for developers and library authors.&lt;/p&gt;

&lt;p&gt;Let's start with end developers example: how they can use AE files.&lt;/p&gt;

&lt;p&gt;With MCP server, the workflow is pretty straightforward:&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation workflow example:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7q3rh8dis9w0nue3iw0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7q3rh8dis9w0nue3iw0d.png" alt=" " width="800" height="2288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same workflow works for other actions like usage, uninstallation, update.&lt;/p&gt;

&lt;p&gt;As you can see, every action is executed by AI Agent, and with MCP server, it is easy to use and maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Library Author workflow:
&lt;/h3&gt;

&lt;p&gt;Almost the same workflow works for library authors - they can just ask AI Agent to bootstrap or update AE files, and AI Agent will do the rest.&lt;/p&gt;

&lt;p&gt;One exception is that to submit AE Files to the Registry, we still need to send PR to the Registry repository.&lt;/p&gt;

&lt;p&gt;(I think we can automate it in the future).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foa7bnrpze4rpnt3z4ifg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foa7bnrpze4rpnt3z4ifg.png" alt=" " width="800" height="2645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it:)&lt;/p&gt;

&lt;p&gt;In the time of writing this article, the registry I've started testing registry and MCP server on personal projects and with some bugs (of course) install / uninstall / configure already works.&lt;/p&gt;

&lt;h1&gt;
  
  
  How to use it Today?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  You are Developer:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;First you need to install MCP server.&lt;br&gt;
To do this, please drop &lt;a href="https://github.com/fluent-meaning-symbiotic/agentic_executables/blob/main/agentic_executables_mcp/ae_install.md" rel="noopener noreferrer"&gt;https://github.com/fluent-meaning-symbiotic/agentic_executables/blob/main/agentic_executables_mcp/ae_install.md&lt;/a&gt; file to your AI Agent or install it manually.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Second, use it:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;to install library (make sure it is in registry) write to your AI Agent: &lt;code&gt;create a plan to instal "library_name" as ae&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;to uninstall - &lt;code&gt;create a plan to uninstall "library_name" as ae&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;to update - &lt;code&gt;create a plan to update "library_name" as ae&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;to use - &lt;code&gt;create rules for {AI Agent} to use "library_name" as ae&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it:)&lt;/p&gt;

&lt;h2&gt;
  
  
  You are Library Author | Maintainer:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;to bootstrap / update - &lt;code&gt;create a plan to bootstrap / update "library_name" as ae&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;to submit to registry - &lt;code&gt;create a plan to submit "library_name" to registry as ae&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it:)&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Please share your thoughts in the comments (that will be great support and motivation for me)! :-)&lt;br&gt;
If you want to discuss / use it / have ideas to improve it - create issue or pull request to the repository: &lt;a href="https://github.com/fluent-meaning-symbiotic/agentic_executables" rel="noopener noreferrer"&gt;https://github.com/fluent-meaning-symbiotic/agentic_executables&lt;/a&gt; or jump in to discord server: &lt;a href="https://discord.gg/y54DpJwmAn" rel="noopener noreferrer"&gt;https://discord.gg/y54DpJwmAn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for your time and have a great day!&lt;/p&gt;

&lt;p&gt;Anton&lt;/p&gt;

&lt;h1&gt;
  
  
  Links:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/fluent-meaning-symbiotic/agentic_executables" rel="noopener noreferrer"&gt;https://github.com/fluent-meaning-symbiotic/agentic_executables&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Registry: &lt;a href="https://github.com/fluent-meaning-symbiotic/agentic_executables_registry" rel="noopener noreferrer"&gt;https://github.com/fluent-meaning-symbiotic/agentic_executables_registry&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP Server: &lt;a href="https://github.com/fluent-meaning-symbiotic/agentic_executables/tree/main/agentic_executables_mcp" rel="noopener noreferrer"&gt;https://github.com/fluent-meaning-symbiotic/agentic_executables/tree/main/agentic_executables_mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Discord Server: &lt;a href="https://discord.gg/y54DpJwmAn" rel="noopener noreferrer"&gt;https://discord.gg/y54DpJwmAn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dev Architecture Series&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-intro-notes-jl2"&gt;Part 1 — Intro Notes&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-2-stage-1-2-5265"&gt;Part 2 — Stage 1 and 2&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-3-stages-3-5-4jd9"&gt;Part 3 — Stage 3,4,5 and Conclusion&lt;/a&gt;&lt;br&gt;
Part 4 — Libraries as Agentic Executables - You are here:)&lt;br&gt;
Part 5 — Maintaining Libraries with AI Agents (planned)&lt;br&gt;
Part 6 — Building Foundation with Open Source in mind (planned)&lt;br&gt;
Part 7 — AI Project Bootstrapping (planned)&lt;br&gt;
Part 8 — Storage Layer as Reliability Foundation (planned)&lt;br&gt;
Part 9 — How to build for different Stores? (planned)&lt;br&gt;
Part 10 — Dev Ethics as Dev Cornerstone (Decision Making) (planned)&lt;br&gt;
Part 11 — Domain Knowledge (Agent Domain Context) (planned)&lt;br&gt;
Part 12 — Building Tests with AI Agents (planned)&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to conduct a useful technical interview (based on my personal experience (subjective opinion))</title>
      <dc:creator>Anton Malofeev</dc:creator>
      <pubDate>Mon, 15 Sep 2025 13:15:15 +0000</pubDate>
      <link>https://dev.to/arenukvern/how-to-conduct-a-useful-technical-interview-based-on-my-personal-experience-subjective-opinion-4h3c</link>
      <guid>https://dev.to/arenukvern/how-to-conduct-a-useful-technical-interview-based-on-my-personal-experience-subjective-opinion-4h3c</guid>
      <description>&lt;p&gt;First of all, you need to understand who and for what tasks you are looking for.&lt;/p&gt;

&lt;p&gt;For example, if you need a developer who can adjust and adapt to tasks, then you should ask about what techniques/methods they use to learn something new, how often they are interested in new things themselves – you can ask how they would conduct research, and if they have had similar experience.&lt;/p&gt;

&lt;p&gt;If you "urgently need a developer" for "this task for a week" you must definitely consider that they will need to get familiar with the codebase and the project itself (adaptation time) – and it’s good if this takes a week or two. Ask a developer does he have such experience, and how comfortable he would work in such case (because any urgent cases usually are the most stressful ones). &lt;/p&gt;

&lt;p&gt;You also may ask does the developer had experience to reorganize planning, to organize more non-stressful process and if he had such - how exactly?&lt;/p&gt;

&lt;p&gt;If you need a developer "to build an app from scratch," it’s better to ask if they have such experience, how much they interacted with designers/products, if they have experience in design development, client communication, and if they have their own codebase. &lt;/p&gt;

&lt;p&gt;The best way to conduct an interview in this case is to describe a small business task (as a complete application) and ask them to estimate what will be required in terms of architecture, tasks, planning, and team interaction to complete the project.&lt;/p&gt;

&lt;p&gt;In all cases, it’s worth asking about motivation (of course, besides the financial aspect), priorities, and future growth (where the person roughly aims to get and why).&lt;/p&gt;

&lt;p&gt;Why this is important:&lt;/p&gt;

&lt;p&gt;In my opinion, everything depends on what kind of people are gathered in the team – how they will work together, whether there will be synergy – sharing experience between developers/designers/products.&lt;/p&gt;

&lt;p&gt;A very important point when evaluating tasks is not that such a task has already been done, but who exactly will do it – someone may already have experience in similar tasks, for someone this particular domain will be unknown, and edge cases will be resolved later...&lt;/p&gt;

&lt;p&gt;Share your experience in the comments :)&lt;/p&gt;

</description>
      <category>technical</category>
      <category>interview</category>
    </item>
    <item>
      <title>Flutter app AI centric architecture for small startups. Part 3 - Stages 3–5</title>
      <dc:creator>Anton Malofeev</dc:creator>
      <pubDate>Thu, 28 Aug 2025 00:17:52 +0000</pubDate>
      <link>https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-3-stages-3-5-4jd9</link>
      <guid>https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-3-stages-3-5-4jd9</guid>
      <description>&lt;p&gt;&lt;em&gt;Thoughts about scalable code structure based on developer as user philosophy combined with iterative design using AI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev Architecture Series&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-intro-notes-jl2"&gt;Part 1 — Intro Notes&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-2-stage-1-2-5265"&gt;Part 2 — Stage 1 and 2, Previous&lt;/a&gt;&lt;br&gt;
&lt;a href=""&gt;Part 3 — Stage 3,4,5 and Conclusion - You are here:)&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/reimagine-libraries-management-as-apps-using-agentic-executable-framework-ami"&gt;Part 4 — Libraries as Agentic Executables&lt;/a&gt;&lt;br&gt;
Part 5 — Maintaining Libraries with AI Agents (planned)&lt;br&gt;
Part 6 — Building Foundation with Open Source in mind (planned)&lt;br&gt;
Part 7 — AI Project Bootstrapping (planned)&lt;br&gt;
Part 8 — Storage Layer as Reliability Foundation (planned)&lt;br&gt;
Part 9 — How to build for different Stores? (planned)&lt;br&gt;
Part 10 — Dev Ethics as Dev Cornerstone (Decision Making) (planned)&lt;br&gt;
Part 11 — Domain Knowledge (Agent Domain Context) (planned)&lt;br&gt;
Part 12 — Building Tests with AI Agents (planned)&lt;/p&gt;


&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the first part of this series, we defined key terms and principles. In Part 2, we walked through Stage 1 and Stage 2. If you missed them, check out the &lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-intro-notes-jl2"&gt;Part 1 — Intro Notes&lt;/a&gt; and &lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-2-stage-1-2-5265"&gt;Part 2 — Stage 1 and 2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; after using Cursor AI and other different agents for about a year it’s become obvious that some changes are needed, therefore I will continue architecture series in future (so the content become a plan xD) — if you have any thoughts — please leave comment:).&lt;/p&gt;

&lt;p&gt;Let’s continue our journey!&lt;/p&gt;


&lt;h2&gt;
  
  
  Stage 3 — Feature Iterations
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Team:&lt;/strong&gt; 2 Developers&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Main focus:&lt;/strong&gt; Test and try features for specific domains to make these domains logically complete.&lt;/p&gt;

&lt;p&gt;While this part is quite small for changes — and may not contain any radical changes in structure, I think it’s quite important on this stage to follow two principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Keep refreshing, refining, and updating domain knowledge from testing and using the application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep every small feature implementation separate from the screen where it is placed. Treat the screen as a layout where you place widgets, and it would be much easier to reuse any feature-related widgets, as they will behave as self-contained micro applications.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Stage 4 — Scaling
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Team:&lt;/strong&gt; 2–3 Developers&lt;/p&gt;

&lt;p&gt;In my opinion, there are two paths at this stage:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2128a10yhl9upoczh04b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2128a10yhl9upoczh04b.png" alt=" " width="646" height="476"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Path 1 — Scaling to Other Platforms
&lt;/h3&gt;

&lt;p&gt;This stage means that we need to publish it to stores on several platforms simultaneously.&lt;/p&gt;

&lt;p&gt;In that case, we will have to deal not only with different factors: platform, adaptive, responsive factors (&lt;a href="https://docs.flutter.dev/ui/adaptive-responsive/best-practices" rel="noopener noreferrer"&gt;https://docs.flutter.dev/ui/adaptive-responsive/best-practices&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That means, it would be better to make the following changes to the structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, move the whole data layer (folders with prefixes data) and core into a new package “core”.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/packages/
├── core/ // or data layer
│   ├── core.dart
│   ├── src/
│   │   ├── core/ // I prefer to keep core as a separate package, as it often has tendency to be reused in other projects, and this way it would be easier to separate it in future to a separate package.
│   │   │   ├── utils/
│   │   │   ├── extensions/
│   │   │   ├── hooks/
│   │   │   ├── l10n/
│   │   │   └── side_services/
│   │   ├── data_local_api/
│   │   ├── data_remote_api/
│   │   ├── data_repositories/
│   │   ├── data_models/
│   │   │   ├── api_dto/
│   │   │   └── {domain}_models/
│   │   ├── data_states/
│   │   ├── di/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Second&lt;/strong&gt;, move the whole ui_kit into a separate package.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/packages/
├── ui_kit/
│   ├── ui_kit.dart
│   ├── UI_KIT_README.md
│   ├── atoms/
│   │   ├── ATOM_README.md
│   ├── molecules/
│   │   ├── MOLECULES_README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Third&lt;/strong&gt;, take a look at domains and features and where they are placed.&lt;/p&gt;

&lt;p&gt;What you can find is that if most of the features were separated from screens inside flows, it is quite easy to separate every screen to the following functionality:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;View Layouts&lt;/strong&gt; // &amp;lt;- layout where features were placed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flow logic&lt;/strong&gt; // &amp;lt;- navigation between views&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt; // &amp;lt;- business implementation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Then&lt;/strong&gt;, move all domain-related logic — layouts (optional), flow (optional), features to a new package “ui_domains”.&lt;/p&gt;

&lt;p&gt;This will be your foundation, where all features, sharable layouts, and flows for domains are written. Think of it like a box of blocks, which separately have some independent functionality within a scope of a specific domain.&lt;/p&gt;

&lt;p&gt;Because every platform has its own layouts, flows can be different. For example, where in mobile you will push several screens, in desktop you may open just one window.&lt;/p&gt;

&lt;p&gt;Then, depending on your end goal, create a separate app for every platform you need.&lt;/p&gt;

&lt;p&gt;For example, you can end up with the following structure:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abstract code structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/
/apps/
├── {platform}_app/  // &amp;lt;- separate applications with new entry main, which can use different layouts, based on ui_domains package.
/packages/
│   ├── core/
│   ├── ui_kit/
│   ├── ui_domains/ // &amp;lt;- this new package will be used in all apps
│   │   ├── src/
│   │   │   ├── ui_{domain}/
│   │   │   │   ├── {DOMAIN}_KNOWLEDGE.md
│   │   │   │   ├── {flow}/
│   │   │   │   │   ├── {feature_name}/
│   │   │   │   │   ├── ├── {feature_name}.dart // barrel file with conditional exports, which are extremly useful for platform dependent features https://dart.dev/tools/pub/create-packages#conditionally-importing-and-exporting-library-files
│   │   │   │   │   ├── ├── {feature_name}_{platform}/
│   │   │   │   │   ├── layouts/ // &amp;lt;- typically you may have different layouts for same features, so it is make sense to place it directly in the flow folder. But in same time, if you need to move to different place - thats fine too - since in my opinion, that's more business/design related decision.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example code structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/
/apps/
├── desktop_app/
├── web_app/
├── mobile_app/
/packages/
├── core/
├── ui_kit/
├── ui_domains/
│   ├── src/
│   │   ├── ui_payments/ // &amp;lt;- domain
│   │   │   ├── ui_payments.dart // &amp;lt;- barrel file with exports
│   │   │   ├── PAYMENTS_KNOWLEDGE.md // &amp;lt;- domain knowledge
│   │   │   ├── pay/ // &amp;lt;- flow
│   │   │   │   ├── qr_pay/ // &amp;lt;- feature
│   │   │   │   │   ├── qr_pay_feature.dart // &amp;lt;- feature barrel file with conditional imports
│   │   │   │   │   ├── qr_pay_ios/ // &amp;lt;- platform feature implementation
│   │   │   │   │   ├── qr_pay_android/
│   │   │   │   │   ├── qr_pay_web/
│   │   │   │   ├── provider_pay/ // &amp;lt;- feature
│   │   │   │   │   ├── provider_pay.dart // &amp;lt;- feature barrel file
│   │   │   │   │   layouts/ // &amp;lt;- flow layouts
│   │   │   │   │   ├── desktop/
│   │   │   │   │   ├── mobile/
│   │   │   ui_profile/ // &amp;lt;- domain
│   │   │   ├── ui_profile.dart // &amp;lt;- domain barrel file
│   │   │   ├── PROFILE_KNOWLEDGE.md // &amp;lt;- domain knowledge
│   │   │   ├── auth/ // &amp;lt;- flow, but as you can imagine, if it will outgrow just auth logical domain, the transform it into a domain and move up.
│   │   │   │   ├── login/ // &amp;lt;- feature
│   │   │   │   ├── ├── login_ios/
│   │   │   │   ├── ├── login_android/
│   │   │   │   ├── ├── login_web/
│   │   │   │   ├── registration/
│   │   │   │   ├── ├── registration_ios/
│   │   │   │   ├── ├── registration_android/
│   │   │   │   ├── ├── registration_web/
│   │   │   │   │   layouts/ // &amp;lt;- flow layouts
│   │   │   │   │   ├── desktop/
│   │   │   │   │   ├── mobile/
│   │   │   ├── settings/ // &amp;lt;- flow
│   │   │   │   ├── settings.dart // &amp;lt;- flow barrel file
│   │   │   │   ├── customization/ // &amp;lt;- feature
│   │   │   │   ├── ├── customization_ios/
│   │   │   │   ├── ├── customization_android/
│   │   │   │   ├── ├── customization_web/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference will depend on what features are represented. For example, some iOS native functionality may not just work or not exist on Linux desktop. Therefore, you will need create a Linux implementation specific to a feature or construct an entirely different experience using only some of iOS features and separate it into independent package.&lt;/p&gt;

&lt;p&gt;The great documentation how to write native plugins and packages is described in flutter website (&lt;a href="https://docs.flutter.dev/packages-and-plugins/developing-packages" rel="noopener noreferrer"&gt;https://docs.flutter.dev/packages-and-plugins/developing-packages&lt;/a&gt;).&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0m24dal353vhniz5vvn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0m24dal353vhniz5vvn.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Path 2 — Same App, Different Configurations
&lt;/h3&gt;

&lt;p&gt;Another way to scale your application by having different flavors. &lt;a href="https://docs.flutter.dev/deployment/flavors" rel="noopener noreferrer"&gt;https://docs.flutter.dev/deployment/flavors&lt;/a&gt; . But at the same time, if the differences are huge, it would be reasonable to reconstruct them as different apps.&lt;/p&gt;

&lt;p&gt;So in contrast with Path 1, I think in this path you may have the same layouts, but new domains, new flows, and new specific to new apps features. The important part, that you may or may not include domains, flows or features to different apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abstract code structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/
/apps/{mobile_app_with_different_flows}/
/packages/
│   ├── core/
│   ├── ui_kit/
│   ├── ui_domains/
│   │   ├── src/
│   │   │   ├── ui_{domain}/
│   │   │   │   ├── {DOMAIN}_KNOWLEDGE.md
│   │   │   │   ├── {flow}/
│   │   │   │   │   ├── {feature_name}/
│   │   │   │   │   ├── {experimental_feature_name}/
│   │   │   │   ├── {experimental_flows}/
│   │   │   │   │   ├── {feature_name}/
│   │   │   ├── ui_{experimental_domain}/
│   │   │   │   ├── {DOMAIN}_KNOWLEDGE.md
│   │   │   │   ├── {flow}/
│   │   │   │   │   ├── {feature_name}/
│   │   │   │   │   ├── ├── {feature_name}_{platform}/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example code structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/
/apps/
├── mobile_app_spring_edition // &amp;lt;- separate applications with new entry main, which can use different layouts, based on ui_domains package.
├── mobile_app_with_gamification/
├── mobile_app_with_ai/
/packages/
├── core/
├── ui_kit/
├── ui_domains/
│   ├── src/
│   │   ├── ui_payments/
│   │   │   ├── ui_payments.dart
│   │   │   ├── PAYMENTS_KNOWLEDGE.md
│   │   │   ├── pay/ // &amp;lt;- flow
│   │   │   │   ├── galactical_pay/ // &amp;lt;- experimental feature
│   │   │   ├── scan_and_pay/ // &amp;lt;- experimental flow
│   │   │   ui_ai_chatbot/ // &amp;lt;- experimental domain
│   │   │   ├── ui_ai_chatbot.dart
│   │   │   ├── AI_CHATBOT_KNOWLEDGE.md
│   │   │   ui_waiting_game/
│   │   │   ├── ui_waiting_game.dart
│   │   │   ├── WAITING_GAME_KNOWLEDGE.md
│   │   │   ui_picture_board/
│   │   │   ├── ui_picture_board.dart
│   │   │   ├── PICTURE_BOARD_KNOWLEDGE.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdayxbd9pvr7r5c3iv9ua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdayxbd9pvr7r5c3iv9ua.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 5 — Scaling Application Domains
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Team:&lt;/strong&gt; 3–6 Developers&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lastly&lt;/em&gt;, let’s talk about what you can do if a feature grows too big, and you have enough resources to maintain it independently.&lt;/p&gt;

&lt;p&gt;Since from the start, you have separated the domains clearly, you have several options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extract the domain as a package&lt;/li&gt;
&lt;li&gt;Extract specific flows as a package&lt;/li&gt;
&lt;li&gt;Extract specific features as a package&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Abstract code structure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/packages/
├── core/
├── ui_kit/
├── ui_{domain}/
│   ├── {DOMAIN}_KNOWLEDGE.md
│   ├── src/
│   │   ├── {flow}/
│   │   │   ├── {feature_name}/
│   │   │   │   ├── {feature_name}_{platform}/
│   │   │   ├── layouts/
│   │   │   │   ├── {layout_name}/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example — moving ui_payments domain to packages:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/packages/
├── ui_payments/
│   ├── ui_payments.dart
│   ├── README.md
│   ├── PAYMENTS_KNOWLEDGE.md
│   ├── src/
│   │   ├── provider_pay/ // &amp;lt;- flow
│   │   │   ├── provider_pay.dart // &amp;lt;- feature
│   │   │   ├── ├── provider_pay_ios/ // &amp;lt;- platform feature implementation
│   │   │   ├── ├── provider_pay_android/
│   │   │   ├── ├── provider_pay_web/
│   │   │   │   layouts/
│   │   │   │   ├── desktop/
│   │   │   │   ├── mobile/
│   │   │   pay/ // &amp;lt;- flow
│   │   │   ├── qr_pay/ // &amp;lt;- feature
│   │   │   │   ├── qr_pay_feature.dart // &amp;lt;- feature
│   │   │   │   ├── ├── qr_pay_ios/ // &amp;lt;- platform feature implementation
│   │   │   │   ├── ├── qr_pay_android/
│   │   │   │   ├── ├── qr_pay_web/
│   │   │   │   layouts/
│   │   │   │   ├── desktop/
│   │   │   │   ├── mobile/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In any case, since on the previous stage you already have an independent data layer as a package + an independent ui_kit, your task is quite simple — treat all and plug them as APIs, and use them the same you use any Flutter widget or any pub package.&lt;/p&gt;

&lt;p&gt;This way, you will still have non-broken dependencies (remember the combination: barrel files + clear and visible separated boundaries between data layers and ui, domains, flows and features), while maintaining flexibility to scale, research, and develop. Hooray!&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In my opinion, if you are an indie developer, you can start small and grow. For a team with several developers, a designer, and analyst, and especially if you have a predefined design, it would be better to start from later stages, as you already have more resources at hand and can handle larger complexity.&lt;/p&gt;

&lt;p&gt;But, also, I think this approach works both ways. For example, if your business is in crisis mode and your developer team is shrinking, basically that will mean that you do not have enough resources to keep huge infrastructure. In that case, in my opinion, it would be extremely helpful to go gently back to early stages and continue from there — that may save you from burnout. And don’t forget about your ideas in prototypes — maybe they will save your team one day:)&lt;/p&gt;

&lt;p&gt;I hope this approach will give you inspiration to iterate, integrate, or to look at your projects from different perspectives and to give more quality to the end user.&lt;/p&gt;

&lt;p&gt;If you found this useful, please share and leave your thoughts in the comments, and have an amazing journey ahead!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thoughts about scalable code structure based on developer as user philosophy combined with iterative design using AI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev Architecture Series&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-intro-notes-jl2"&gt;Part 1 — Intro Notes&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-2-stage-1-2-5265"&gt;Part 2 — Stage 1 and 2, Previous&lt;/a&gt;&lt;br&gt;
Part 3 — Stage 3,4,5 and Conclusion - You are here:)&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/reimagine-libraries-management-as-apps-using-agentic-executable-framework-ami"&gt;Part 4 — Libraries as Agentic Executables&lt;/a&gt;&lt;br&gt;
Part 5 — Maintaining Libraries with AI Agents (planned)&lt;br&gt;
Part 6 — Building Foundation with Open Source in mind (planned)&lt;br&gt;
Part 7 — AI Project Bootstrapping (planned)&lt;br&gt;
Part 8 — Storage Layer as Reliability Foundation (planned)&lt;br&gt;
Part 9 — How to build for different Stores? (planned)&lt;br&gt;
Part 10 — Dev Ethics as Dev Cornerstone (Decision Making) (planned)&lt;br&gt;
Part 11 — Domain Knowledge (Agent Domain Context) (planned)&lt;br&gt;
Part 12 — Building Tests with AI Agents (planned)&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>architecture</category>
      <category>softwaredevelopment</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Flutter 💙 Cursor: setting up Background Agent</title>
      <dc:creator>Anton Malofeev</dc:creator>
      <pubDate>Wed, 09 Jul 2025 22:25:44 +0000</pubDate>
      <link>https://dev.to/arenukvern/flutter-cursor-setting-up-background-agent-nfp</link>
      <guid>https://dev.to/arenukvern/flutter-cursor-setting-up-background-agent-nfp</guid>
      <description>&lt;p&gt;If you prefer to use Jules (Google AI Agent ), check out &lt;a href="https://dev.to/arenukvern/flutter-jules-setting-up-container-for-background-ai-agent-5gni"&gt;this article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Short story — Cursor introduced AI Agents which allows you to run any tasks in background the same way as in IDE with the same setup.&lt;br&gt;
To give proper setup for AI Agent, we need to setup container the same way you would do for your own computer.&lt;/p&gt;

&lt;p&gt;Let’s get started:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Cursor Settings (the panel may be placed in different place, since it depends on how you customized your interface, so you could use Command+Shift+P to open command panel and type “cursor settings”).&lt;/li&gt;
&lt;li&gt;Open Background Agents panel&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5tuxa6g4oinyq9zrlnr9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5tuxa6g4oinyq9zrlnr9.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Give Cursor GitHub Access for your sepcific repository. Click Go To GitHub to allow access to.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxebyw4fk2u0vgw8z0ri6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxebyw4fk2u0vgw8z0ri6.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select your repository, to allow access to. Notice: for public repositories owned by organizations, you will have to fork the repository to your personal repositories.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpg45qer8s80san7dtdin.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpg45qer8s80san7dtdin.png" alt=" " width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After allowing access, make sure you click refresh and you should see Access Granted.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabunan1tiz4y8aerfmvn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fabunan1tiz4y8aerfmvn.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click Base Environment and then Setup machine interactively.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh7bsws7pjulh64rl4j2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh7bsws7pjulh64rl4j2.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wait until you see the chat interface&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewjrdp5tycp9xp0x4z11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewjrdp5tycp9xp0x4z11.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write to agent the command to install required dependencies.
Use agent mode, so agent could verify setup and update other dependencies if needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I used the following script:&lt;/p&gt;

&lt;p&gt;Hi. Please install Flutter &amp;amp; Dart.&lt;/p&gt;

&lt;p&gt;Use the command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Install Dart SDK (using apt, official Google repo)&lt;/span&gt;
sudo apt-get update
sudo apt-get install -y apt-transport-https wget
wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /etc/apt/keyrings/dart.gpg
echo "deb [signed-by=/etc/apt/keyrings/dart.gpg] https://storage.googleapis.com/download.dartlang.org/linux/debian stable main" | sudo tee /etc/apt/sources.list.d/dart_stable.list
sudo apt-get update
sudo apt-get install -y dart
&lt;span class="gh"&gt;# Add Dart to PATH&lt;/span&gt;
export PATH="$PATH:/usr/lib/dart/bin"
&lt;span class="gh"&gt;# Clone Flutter&lt;/span&gt;
cd /opt &amp;amp;&amp;amp; sudo git clone https://github.com/flutter/flutter.git -b stable
sudo chown -R $USER:$USER /opt/flutter
export PATH="$PATH:/opt/flutter/bin" &amp;amp;&amp;amp; cd /workspace
flutter pub get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftoyoe8n4981mitagvf5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftoyoe8n4981mitagvf5n.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After Agent finished the job, click Take Snapshot&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp14llvgp8rkbp7zsn01i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp14llvgp8rkbp7zsn01i.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add command flutter pub get or any script you usually use to get all dependencies in your project&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnobjkclw76rjc3x67su.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvnobjkclw76rjc3x67su.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After that, verify that everything works&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffp6qrha6q2cl67b60dcx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffp6qrha6q2cl67b60dcx.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;That’s it! Now you can use background agent from any accessible ui point (from settings, from tab, pwa app or cursor website).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvt9gvhs14hmjdre9589c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvt9gvhs14hmjdre9589c.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope this concept proves useful :-)&lt;/p&gt;

&lt;p&gt;Please share your thoughts in the comments :-) This will help make this article visible to others and will be great support and motivation :-)&lt;/p&gt;

&lt;p&gt;Thank you for your time and have a good day!&lt;/p&gt;

&lt;p&gt;Anton&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>cursor</category>
      <category>agents</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Ethical AI Dev Manifesto</title>
      <dc:creator>Anton Malofeev</dc:creator>
      <pubDate>Fri, 04 Jul 2025 08:12:17 +0000</pubDate>
      <link>https://dev.to/arenukvern/my-principles-at-work-credo-182c</link>
      <guid>https://dev.to/arenukvern/my-principles-at-work-credo-182c</guid>
      <description>&lt;p&gt;While it may sound strange why to publish, but while I was preparing to find new opportunities and adventures, it is started to sound like a credo. So why not share it:)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: I have not used any AI tools for help this time:)&lt;br&gt;
So here we go, my principles at work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ethical Principles&lt;/strong&gt;. 
Why: when business have certain principles to design software, it usually prioritizes creating unique value for End User. This helps a lot with defining how team communicates with each other, how application looks and function, how code is written (by knowing constraints and freedoms within). Also by having ethical principles it is clear when AI can be used (in end product or in IDE), and when it shouldn’t.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User &amp;amp; Team Experience&lt;/strong&gt;. 
In my work I prioritize impact for End User and sense of team while working with other people. 
&lt;strong&gt;Meaning&lt;/strong&gt;: I value other people experience and believe that culture of experience sharing is worth the time. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value via Care &amp;amp; Innovation.&lt;/strong&gt;
I believe that the app should be simple, focused and worth of people time who is using it. Combining with growing technologies, especially AI (cloud or on-device LLMs), I believe that so many things can be reimagined and fundamentally rethought making User experience as priority.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI:&lt;/strong&gt; 
I use Cursor (mostly) for writing a code. But thinking of the code as co-colleague, who can teach me new things, reimagine old things. In the same time, every my decision where I use it and why is based on &lt;a href="https://dev.to/arenukvern/small-thought-developer-ethics-may-be-a-bridge-to-work-with-ai-tools-3mha"&gt;Ethical principles&lt;/a&gt; - this allows me to build faster but with more quality for End User and Developer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer &amp;amp; Designer &amp;amp; QA  as User.&lt;/strong&gt;
In my opinion that every person who can access a code is a user too.
&lt;strong&gt;Meaning&lt;/strong&gt;: writing useful documentation, making API useful, making Design System accessible for Designer, getting any feedback (via code review, or application preview) is extremely important for me.  In my opinion this  process makes not only product better, but every person who involved in its creation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prototyping.&lt;/strong&gt; 
From my experience many of the great ideas and practices are coming from iterations and fast prototyping - because it is not only allows to feel the idea, but to share, and experience it yourself and share with others. And hearing the feedback is most of important part of prototyping  too 🙂&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timing&lt;/strong&gt;.
Usually I use simple formula to get most correct time: Team + Known Knowledge + My Experience  + My Experience in the codebase | domain.
&lt;strong&gt;Meaning&lt;/strong&gt;: when measuring how long feature/bug/app can be developed I usually need to know the people who works with me, then the codebase and then combine it with all I know.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I hope this post inspires and proves useful in some way :-)&lt;/p&gt;

&lt;p&gt;Please share your thoughts in the comments :-) this will help make this thread visible to others and will be great support and motivation :-)&lt;/p&gt;

&lt;p&gt;Thank you for your time and have a good day!&lt;/p&gt;

</description>
      <category>workprincples</category>
      <category>aiprinciples</category>
    </item>
    <item>
      <title>Flutter 💙 Jules (setting up container for background AI Agent)</title>
      <dc:creator>Anton Malofeev</dc:creator>
      <pubDate>Wed, 18 Jun 2025 22:22:39 +0000</pubDate>
      <link>https://dev.to/arenukvern/flutter-jules-setting-up-container-for-background-ai-agent-5gni</link>
      <guid>https://dev.to/arenukvern/flutter-jules-setting-up-container-for-background-ai-agent-5gni</guid>
      <description>&lt;p&gt;At this Google I/O, Google introduced a new development tool: &lt;a href="https://jules.google.com" rel="noopener noreferrer"&gt;https://jules.google.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are the advantages?&lt;/strong&gt; It’s currently free, runs on Gemini, and it’s an AI Agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does this mean (example)?&lt;/strong&gt; Often, there’s a problem where the number of modules or libraries you’d like to create or maintain in the project exceeds what can be maintained (if you are solo or small team), especially if you’re managing an open-source library in spare time.&lt;br&gt;
Background agents help take on &lt;strong&gt;some of the work.&lt;/strong&gt; I’ve found them useful for documentation, light refactoring, and implementing small features.&lt;/p&gt;

&lt;p&gt;To get started, you can usually use a short prompt to pre-create a plan that Jules will partially follow (in reality, it will recreate the plan, but having references will make it easier):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please write a condensed plan for an AI Agent so it can execute it step by step. Make sure that the plan has only one final goal; otherwise, ask the user what to do.&lt;br&gt;
Make sure that the plan contains original links to sources, a chosen configuration script, and is written in a way that allows for one-click copy &amp;amp; paste.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This plan can be created in any AI chat, but when working with the plan, it’s advisable to specify the project/documentation the agent will be working with.&lt;br&gt;
An important part of the prompt that needs to be included in the prompt-plan is the Flutter installation in Ubuntu:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Always add as first steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Branch &amp;amp; Environment Setup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;1.1 Create a new branch from the default branch (e.g., {name}).&lt;/p&gt;

&lt;p&gt;1.2 Run the provided environment setup scripts to ensure Dart, FVM, and Flutter are correctly installed and configured.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For flutter fvm (should be dependent from what user asks):&lt;/li&gt;
&lt;/ul&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Install Dart SDK (using apt, official Google repo)
sudo apt-get update
sudo apt-get install -y apt-transport-https wget
wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'wget -qO- https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list &amp;gt; /etc/apt/sources.list.d/dart_stable.list'
sudo apt-get update
sudo apt-get install -y dart
# Add Dart to PATH
export PATH="$PATH:/usr/lib/dart/bin”
# Install FVM globally
dart pub global activate fvm
# Add FVM to PATH
export PATH="$PATH:$HOME/.pub-cache/bin"
# Install Flutter version from .fvmrc
fvm install
# Get Flutter dependencies
fvm flutter pub get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;For flutter without fvm:
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Install Dart SDK (using apt, official Google repo)
sudo apt-get update
sudo apt-get install -y apt-transport-https wget
wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'wget -qO- https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list &amp;gt; /etc/apt/sources.list.d/dart_stable.list'
sudo apt-get update
sudo apt-get install -y dart
# Add Dart to PATH
export PATH="$PATH:/usr/lib/dart/bin"
flutter pub get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why is this important?
&lt;/h2&gt;

&lt;p&gt;Initially, Jules (like Cursor background agents and Codex) runs in an isolated environment. Since Dart &amp;amp; Flutter are typically not present in the container, they need to be forcibly installed before starting work on a project. By declaring this in the initial prompt, we provide clearer instructions on how the agent should act, which enables it to complete the task with higher quality.&lt;/p&gt;

&lt;p&gt;I hope this concept proves useful :-)&lt;/p&gt;

&lt;p&gt;Please share your thoughts in the comments :-) This will help make this article visible to others and will be great support and motivation :-)&lt;/p&gt;

&lt;p&gt;Thank you for your time and have a good day!&lt;br&gt;
Anton&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>ai</category>
      <category>vibecoding</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>small thought: Developer Ethics may be a bridge to work with AI tools</title>
      <dc:creator>Anton Malofeev</dc:creator>
      <pubDate>Thu, 15 May 2025 13:20:23 +0000</pubDate>
      <link>https://dev.to/arenukvern/small-thought-developer-ethics-may-be-a-bridge-to-work-with-ai-tools-3mha</link>
      <guid>https://dev.to/arenukvern/small-thought-developer-ethics-may-be-a-bridge-to-work-with-ai-tools-3mha</guid>
      <description>&lt;p&gt;Last year, I intensely started using AI (LLM) tools and caught a terrible wave of sadness and melancholy after 5–6 months of use.&lt;/p&gt;

&lt;p&gt;For me, the most difficult thing wasn’t that an LLM could write code in general, but the realization that, in fact, it’s not that important. A much more significant abstract question arose: why even write it if everything could change so quickly tomorrow that you wouldn’t even blink?&lt;/p&gt;

&lt;p&gt;After feeling down and literally being sick of it, and wandering through bookstores, I stumbled upon an interesting book — “The Art of Excellent Products: Enchanting Customers with Premium Brand Experiences” by Riccardo Illy. And this book resonated so deeply that I understood how to resolve (for the time being) the moral dilemma with AI code, when you don’t write the code yourself, but AI does — through ethical principles.&lt;/p&gt;

&lt;p&gt;In my opinion, ethical principles offer three possibilities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Limitations or focus — by establishing principles, you can focus only on what is truly important and discard/deprioritize what does not align with these principles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Flexibility in decision-making — knowing the limitations and having an ethical focus, you can, if necessary, make responsible decisions faster, but without sacrificing what is ethically important for the company/product.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trust — having limitations in the form of chosen ethical principles, the values of the product/company can become more resilient to crises — which in the end can lead to more trust in the product for the end user. In theory :) Therefore, since the beginning of the year, I have started thinking about principles/values and trying to understand which ones are suitable — and why.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So I stepped away from digital to write by hand in a notebook. I’ve divided them into several groups, since I think they may change from the type of purpose.&lt;/p&gt;

&lt;p&gt;I choose: Applications, Games, Personal Principles&lt;/p&gt;

&lt;p&gt;For example for apps I came to:&lt;br&gt;
— Convenience&lt;br&gt;
— Simplicity&lt;br&gt;
— Safety&lt;br&gt;
— Longevity&lt;br&gt;
— Usefulness&lt;/p&gt;

&lt;p&gt;For games (since it’s my hobby, it a little different):&lt;br&gt;
— Usefulness&lt;br&gt;
— Creativity&lt;br&gt;
— Fun&lt;br&gt;
— Challenge&lt;/p&gt;

&lt;p&gt;I feel they will change over time, but for a start it is enough.&lt;br&gt;
Currently (May), the 5th month of testing — and I can honestly say that it has become much easier to focus on the problem and the solution than before. I am sure that a lot will change with the development of AI — but it seems like this could become a bridge for working with it from a moral and ethical standpoint (especially when you need to negotiate/choose between faster and better).&lt;/p&gt;

&lt;p&gt;I hope this post inspires and proves useful in some way :-)&lt;br&gt;
Please share your thoughts in the comments :-) this will help make this thread visible to others and will be great support and motivation :-)&lt;/p&gt;

&lt;p&gt;Thank you for your time and have a good day!&lt;/p&gt;

</description>
      <category>development</category>
      <category>programming</category>
      <category>mentalhealth</category>
      <category>ethics</category>
    </item>
    <item>
      <title>Dart -  applying zero objects and isEmpty pattern to everything</title>
      <dc:creator>Anton Malofeev</dc:creator>
      <pubDate>Tue, 25 Mar 2025 22:18:46 +0000</pubDate>
      <link>https://dev.to/arenukvern/dart-applying-zero-objects-and-isempty-pattern-to-everything-4cnp</link>
      <guid>https://dev.to/arenukvern/dart-applying-zero-objects-and-isempty-pattern-to-everything-4cnp</guid>
      <description>&lt;p&gt;It's more of a technical note, rather than an article, so I will try to express the idea more in a condensed and clear manner.&lt;/p&gt;

&lt;p&gt;Before getting started, if your way to see how it works, I've recently uploaded small package - &lt;a href="https://pub.dev/packages/is_dart_empty_or_not#" rel="noopener noreferrer"&gt;see it here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Coming from the JS/TS world, when I first used Dart, the most fascinating thing among others was to use the &lt;strong&gt;isEmpty&lt;/strong&gt; or &lt;strong&gt;isNotEmpty&lt;/strong&gt; functions, and for strings, lists, maps, etc. It was amazingly simple, just not to write every time &lt;strong&gt;.length == 0&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Also, it was very useful to use &lt;strong&gt;empty/zero&lt;/strong&gt; values like &lt;strong&gt;Duration.zero, Offset.zero&lt;/strong&gt;, and many others that were a nice addition to this pattern.&lt;/p&gt;

&lt;p&gt;Over time, I developed a habit to use the same principle for different cases and came to think, what if we use zero values for most cases, eliminating the need for null for most cases (not all, but nonetheless)? I searched and found that a similar  pattern is used in Go, so I've started thinking:&lt;/p&gt;

&lt;h1&gt;
  
  
  Problem
&lt;/h1&gt;

&lt;p&gt;imagine situation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// do something&lt;/span&gt;

&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"new value”;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What checks should we make to ensure the value exists to assign some value to a new variable?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
  &lt;span class="c1"&gt;// do something&lt;/span&gt;
  &lt;span class="n"&gt;newValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="n"&gt;defaultValue&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;newValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What is the difference between null and isEmpty check in this situation?&lt;br&gt;
What if we write&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;“”&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;newValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
  &lt;span class="c1"&gt;// do something&lt;/span&gt;
  &lt;span class="n"&gt;newValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="n"&gt;defaultValue&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;newValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// use newValue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nice but still verbose.&lt;br&gt;
Would that be nice to use it inline? Let's try to rewrite it with a new extension:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;extension&lt;/span&gt; &lt;span class="n"&gt;StringX&lt;/span&gt; &lt;span class="kd"&gt;on&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;whenEmptyUse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;isEmpty&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;newValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;whenEmptyUse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"defaultValue"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What if we try to apply it to lists, maps, values, and numbers?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;extension&lt;/span&gt; &lt;span class="n"&gt;ListX&lt;/span&gt; &lt;span class="kd"&gt;on&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;whenEmptyUse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;isEmpty&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;newValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;whenEmptyUse&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;'defaultValue'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="n"&gt;extension&lt;/span&gt; &lt;span class="n"&gt;DoubleX&lt;/span&gt; &lt;span class="kd"&gt;on&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;isZero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;whenZeroUse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;isZero&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;newOpacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;whenZeroUse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern is extremely useful with zero/empty values for objects too. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;isEmpty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;isNotEmpty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isNotEmpty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// or use different names for to read nicer&lt;/span&gt;
  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;isInitialized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isNotEmpty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;isNotInitialized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;extension&lt;/span&gt; &lt;span class="n"&gt;PersonX&lt;/span&gt; &lt;span class="kd"&gt;on&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="n"&gt;Person&lt;/span&gt; &lt;span class="n"&gt;whenEmptyUse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;isEmpty&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we could use it everywhere the same simple way as checking a string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// do something dangerous&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;newPerson&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;whenEmptyUse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;name:&lt;/span&gt;&lt;span class="s"&gt;'Frodo'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We could do same for IDs, Lists with types, etc. etc..&lt;br&gt;
This way we use simpler API, always know for sure that we have some value and we know how to identify default (empty, zero) value.&lt;/p&gt;

&lt;p&gt;Hopefully it helps:) &lt;/p&gt;

&lt;p&gt;Please don't forget to share your thoughts in comments:) it really helps the algorithms give this article to others to read, and it would be great support from you:)&lt;/p&gt;

&lt;p&gt;Have a nice day!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>dart</category>
      <category>codestyle</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Flutter app AI centric architecture for small startups. Part 2 — Stage 1 &amp; 2</title>
      <dc:creator>Anton Malofeev</dc:creator>
      <pubDate>Tue, 04 Feb 2025 22:19:11 +0000</pubDate>
      <link>https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-2-stage-1-2-5265</link>
      <guid>https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-2-stage-1-2-5265</guid>
      <description>&lt;p&gt;&lt;em&gt;Thoughts about scalable code structure based on developer as user philosophy combined with iterative design using AI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cover - Imaginary Gantt chart depicting astronomical growth and burnout:) Generated in leonardo.ai by feelings of building project.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev Architecture Series&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-intro-notes-jl2"&gt;Part 1 — Intro Notes — Previous&lt;/a&gt;&lt;br&gt;
Part 2 — Stage 1 and 2 — You are here:)&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-3-stages-3-5-4jd9"&gt;Part 3 — Stage 3,4,5 and Conclusion Next&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/reimagine-libraries-management-as-apps-using-agentic-executable-framework-ami"&gt;Part 4 — Libraries as Agentic Executables&lt;/a&gt;&lt;br&gt;
Part 5 — Maintaining Libraries with AI Agents (planned)&lt;br&gt;
Part 6 — Building Foundation with Open Source in mind (planned)&lt;br&gt;
Part 7 — AI Project Bootstrapping (planned)&lt;br&gt;
Part 8 — Storage Layer as Reliability Foundation (planned)&lt;br&gt;
Part 9 — How to build for different Stores? (planned)&lt;br&gt;
Part 10 — Dev Ethics as Dev Cornerstone (Decision Making) (planned)&lt;br&gt;
Part 11 — Domain Knowledge (Agent Domain Context) (planned)&lt;br&gt;
Part 12 — Building Tests with AI Agents (planned)&lt;/p&gt;
&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the first part of the series, we defined key terms and principles. If you didn’t checkout — check &lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-intro-notes-jl2"&gt;Part 1 — Intro Notes.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s continue our journey!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Before get started — currently I’ve completed writing last part, but still need about a week to prepare it properly and publish. Thank you for your understanding.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Stage 1 — Prototyping.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Team: 1 (or at best 2) Developers&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Main focus: develop fast and throw away every piece you don’t like as a ClientUser (or call it business).&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Treat your repo as a &lt;em&gt;workbench&lt;/em&gt; — you don’t know what will work, so expect multiple projects at the same time, even in different frameworks, different languages.&lt;/p&gt;

&lt;p&gt;I suggest the following folder structure in that stage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abstract code structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/
├── prototypes
│   ├── &lt;span class="o"&gt;{&lt;/span&gt;prototype_name&lt;span class="o"&gt;}&lt;/span&gt;
│   │   ├── idea.md  // This file contains the initial ideas and AI-generated insights &lt;span class="k"&gt;for &lt;/span&gt;the prototype.
├── prompts
│   ├── agents
│   │   ├── &lt;span class="o"&gt;{&lt;/span&gt;name&lt;span class="o"&gt;}&lt;/span&gt;_agent.md  // Rules and guidelines &lt;span class="k"&gt;for &lt;/span&gt;AI agents used &lt;span class="k"&gt;in &lt;/span&gt;the project.
│   ├── ideas
│   │   ├── &lt;span class="o"&gt;{&lt;/span&gt;idea&lt;span class="o"&gt;}&lt;/span&gt;_gen.md  // Only AI-generated answers - ideas and prompts.
│   │   ├── &lt;span class="o"&gt;{&lt;/span&gt;idea&lt;span class="o"&gt;}&lt;/span&gt;.md  // Handwritten notes and domain knowledge. May include AI-generated answers too.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example code structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/
├── prototypes
│   ├── flutter/todo_with_amazing_animation
│   │   ├── idea.md
│   ├── typescript/yjs_prototype
│   │   ├── idea.md
│   ├── dart/frog_server
│   │   ├── idea.md
│   ├── just_cool_feature
│   │   ├── idea.md
├── prompts
│   ├── agents
│   │   ├── flutter_agent.md
│   │   ├── flutter_architector_agent.md
│   │   ├── rust_agent.md
│   ├── ideas
│   │   ├── charmed_animated_scroll_gen.md
│   │   ├── that_gradient_shader.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you don’t like the word &lt;em&gt;prototype&lt;/em&gt;, use &lt;em&gt;playground&lt;/em&gt; or &lt;em&gt;experiments&lt;/em&gt; — this word is important because in later stages you will want to make sure that these pieces are playable, even for newcomers, but not movable, so your git commit will not explode xD&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Every prototype should be as small as possible — it can be one to three files just to test and experience your idea.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I would advise not to set up strict lints for this stage to keep code as simple and small as possible, but in case you are testing them or using a new language — certainly go for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 2 — Domain iterations.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Team: 1–2 Developers&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Main focus: set up such an architecture that will support and help fast iterations in domains and do so.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The stage when you have at least one idea, and you are about to start development of the MVP (Minimum Viable Product).&lt;/p&gt;

&lt;p&gt;And you iterate over and over domains to find the best (at this particular moment) experience for end users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A note about linter rules&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8qvndqc32uqebqgpp9k.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy8qvndqc32uqebqgpp9k.jpg" alt="Strangely, just a couple of linter rules — and your path to create or eliminate your technical debt is set..&amp;lt;br&amp;gt;
" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Strangely, just a couple of linter rules — and your path to create or eliminate your technical debt is set..&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Choose your linter rules even before you look into the code, and choose wisely. These rules will affect not only you, but your AI-generated code, code quality, and technical debt as eventually, your codebase will grow, and if you decide to change just one rule, you may trigger a huge amount of linter warnings, errors, and team discussions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI Kit&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This stage highly depends on the question — are you a completely lone developer, or a team with a designer, because the first thing to do is to create some, maybe not perfect, but usable ui_kit.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To make this, try to look into different techniques for organizing it. Personally, I prefer to use at least two steps from the &lt;a href="https://atomicdesign.bradfrost.com/chapter-2/" rel="noopener noreferrer"&gt;Atomic Design methodology&lt;/a&gt;: &lt;em&gt;atoms&lt;/em&gt; and &lt;em&gt;molecules&lt;/em&gt;, but in my opinion, it highly depends on &lt;em&gt;what you expect to achieve with the design, for what platforms the product is developing, etc.&lt;/em&gt; For one product, it can have only atoms and molecules. Another one — specific repeatable patterns for complex product cards, layout templates, pages templates, for another — Material, Human Guidelines, FluentUI approach (usually in that case, it is quite convenient to find official design in Figma or Sketch, etc.).&lt;/p&gt;

&lt;p&gt;Treat it as a &lt;em&gt;completely standalone library&lt;/em&gt; to not tie to any business requirements and focus on how it would be convenient to use, to develop, and maintain not only by you but by other developers and AI too.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Hopefully, to get it into the right words — that doesn’t mean it should be perfect, rather it should have well-documented READMEs around to explain the principles of how to create a new component of this library and make it useful.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From my experience, it is critically important how well you organize and define taxonomy, documentation, and convenience — this will affect any developer’s decision in the future, how fast you will be able to iterate (develop new, maintain, fix, and change old) for features, screens, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UI Kit relations &amp;amp; workflow example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnyu0r7i1anklb45c03zx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnyu0r7i1anklb45c03zx.png" alt="UI Kit relations &amp;amp; workflow example" width="800" height="928"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then create the basic app code structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abstract code structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;├── core // everything that is not API, data, state, and ui. May contain isolated business logic, but not tied to any specific domain.
│   ├── utils  // Utility functions, some duplicate isolated logic that is more related to the framework than the app, such as serialization, etc.
│   ├── extensions  // Extensions &lt;span class="k"&gt;for &lt;/span&gt;types.
│   ├── hooks  // Optional hooks &lt;span class="k"&gt;for &lt;/span&gt;logic duplication reduction. Usually handy &lt;span class="k"&gt;for &lt;/span&gt;small portions of logic that are used &lt;span class="k"&gt;in &lt;/span&gt;build methods.
│   ├── l10n  // Optional localization files.
│   ├── side_services  // Optional third-party services like Firebase, Analytics, etc.
├── data_local_api  // I use word API, as it is just shorter:&lt;span class="o"&gt;)&lt;/span&gt; but it has the same meaning as services, sources&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Prefer to treat it as your &lt;span class="nb"&gt;local &lt;/span&gt;backend server.
├── data_remote_api  // &lt;span class="o"&gt;(&lt;/span&gt;services, sources&lt;span class="o"&gt;)&lt;/span&gt; Remote APIs, preferably generated from backend schemas &lt;span class="o"&gt;(&lt;/span&gt;REST or GraphQL or any other&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
├── data_repositories  // &lt;span class="o"&gt;(&lt;/span&gt;optional&lt;span class="o"&gt;)&lt;/span&gt; Handles both &lt;span class="nb"&gt;local &lt;/span&gt;and remote APIs.
├── data_models
│   ├── api_dto  // &lt;span class="o"&gt;(&lt;/span&gt;optional&lt;span class="o"&gt;)&lt;/span&gt; Data Transfer Objects &lt;span class="k"&gt;for &lt;/span&gt;APIs. Preferably generated &lt;span class="k"&gt;for &lt;/span&gt;remote APIs, can be useful &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;APIs too.
│   ├── &lt;span class="o"&gt;{&lt;/span&gt;domain&lt;span class="o"&gt;}&lt;/span&gt;_models  // &lt;span class="o"&gt;(&lt;/span&gt;optional&lt;span class="o"&gt;)&lt;/span&gt; Domain-specific models.
├── data_states  // Global level states &lt;span class="k"&gt;for &lt;/span&gt;runtime data &lt;span class="o"&gt;(&lt;/span&gt;notifiers, controllers, blocs, commands, etc.&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Its purpose mostly to keep runtime data prepared to use &lt;span class="k"&gt;in &lt;/span&gt;UI. These states can be used &lt;span class="k"&gt;in &lt;/span&gt;all domains.
├── di  // Dependency injection setup &lt;span class="o"&gt;(&lt;/span&gt;it may be provider, get_it, inherited_models, etc.&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Will be available &lt;span class="k"&gt;for &lt;/span&gt;all domains &lt;span class="k"&gt;in &lt;/span&gt;the app. Here you can &lt;span class="nb"&gt;set &lt;/span&gt;up API, states + methods to initialize them and use &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;ui_root&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
├── ui_root  // Place here everything that is needed &lt;span class="k"&gt;for &lt;/span&gt;the app to start: bootstrap methods, data_state and side_services initialization, error catching &lt;span class="o"&gt;(&lt;/span&gt;Firebase, Sentry&lt;span class="o"&gt;)&lt;/span&gt;, Analytics, etc.
├── ui_kit // uses below two Atomic Design principles: atoms and molecules, but you can use any other principles, such as Material, Human Guidelines, FluentUI, etc.
│   ├── UI_KIT_README.md  // Short Rules and main principles defining how and why you made certain choices &lt;span class="k"&gt;in &lt;/span&gt;underlying structure and links to the underlying READMEs. The last part is important, because as I found out, AI tools like to use README &lt;span class="k"&gt;for &lt;/span&gt;designing or development.
│   ├── atoms
│   │   ├── ATOM_README.md  // Domain knowledge &lt;span class="k"&gt;for &lt;/span&gt;atoms.
│   ├── molecules
│   │   ├── MOLECULE_README.md  // Domain knowledge &lt;span class="k"&gt;for &lt;/span&gt;molecules.
├── ui_&lt;span class="o"&gt;{&lt;/span&gt;domain&lt;span class="o"&gt;}&lt;/span&gt; // all ui domains
│   ├── &lt;span class="o"&gt;{&lt;/span&gt;DOMAIN&lt;span class="o"&gt;}&lt;/span&gt;_KNOWLEDGE.md  // Domain knowledge &lt;span class="k"&gt;for &lt;/span&gt;the specific UI domain.
│   ├── &lt;span class="o"&gt;{&lt;/span&gt;flow&lt;span class="o"&gt;}&lt;/span&gt; // one or more screens or views united into one flow. Every flow has one entry point screen &lt;span class="o"&gt;(&lt;/span&gt;or at least one&lt;span class="o"&gt;)&lt;/span&gt; and every screen has one or more features.
│   │   ├── &lt;span class="o"&gt;{&lt;/span&gt;flow&lt;span class="o"&gt;}&lt;/span&gt;_screen.dart  // Entry point &lt;span class="k"&gt;for &lt;/span&gt;the flow.
│   │   ├── &lt;span class="o"&gt;{&lt;/span&gt;feature_name&lt;span class="o"&gt;}&lt;/span&gt;  // Domain and flow-specific features.
├── envs.dart  // &lt;span class="o"&gt;[&lt;/span&gt;Environment variables]&lt;span class="o"&gt;(&lt;/span&gt;https://codewithandrea.com/tips/dart-define-from-file-env-json/&lt;span class="o"&gt;)&lt;/span&gt;
├── router.dart  // Your preferred router setup with defined routes
├── &lt;span class="o"&gt;{&lt;/span&gt;platform&lt;span class="o"&gt;}&lt;/span&gt;_app.dart  // Entry point &lt;span class="k"&gt;for &lt;/span&gt;the platform-specific app.
├── common_imports.dart  // Optional. Place here all imports that are used &lt;span class="k"&gt;in &lt;/span&gt;the whole app. Also, it is handy to place here all exports from barrel files from each top folder.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And finally, create domains &lt;em&gt;ui&lt;/em&gt;{domains}_ which will include the most critical app experience and iterate over them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A note about UI Domains&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbypwikncpj3podv4atm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbypwikncpj3podv4atm.png" alt="Schematic example of what can be shared, and what — can’t inside domains." width="800" height="390"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Schematic example of what can be shared, and what — can’t inside domains.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Inside domain, you may work with different types of &lt;em&gt;data layer, screen states, widget states&lt;/em&gt; (in Flutter it is called &lt;a href="https://docs.flutter.dev/data-and-backend/state-mgmt/ephemeral-vs-app#ephemeral-state" rel="noopener noreferrer"&gt;Ephemeral state&lt;/a&gt;), some business logic, specific to feature models which you never intend to share with other domains.&lt;/p&gt;

&lt;p&gt;I suggest a small decision to manage relations between domains — &lt;strong&gt;reuse only widgets&lt;/strong&gt; (&lt;em&gt;flows, screens, features&lt;/em&gt;), &lt;strong&gt;do not share/reuse data.&lt;/strong&gt; If you need to &lt;em&gt;share&lt;/em&gt; something from domain &lt;em&gt;local data&lt;/em&gt; layer — move it to &lt;em&gt;global data&lt;/em&gt; layer, from which it will be available for all domains. For example, a &lt;em&gt;local&lt;/em&gt; model may go to &lt;em&gt;data_models&lt;/em&gt;, &lt;em&gt;screen&lt;/em&gt; state maybe refactored and go to &lt;em&gt;data_states&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A word about &lt;em&gt;data_states&lt;/em&gt; — Flutter documentation calls it &lt;a href="https://docs.flutter.dev/data-and-backend/state-mgmt/ephemeral-vs-app#app-state" rel="noopener noreferrer"&gt;App State&lt;/a&gt;. In other words, you can define it as global-level states for runtime data (notifiers, controllers, blocs, commands, etc.). Its purpose is mostly to keep runtime data prepared to use in UI. These states can be used in all domains.&lt;/p&gt;

&lt;p&gt;Now let’s move back to global project structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relations between global layers&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Option 1 — with common_imports&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffarwuavk8uxxsrv97kr2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffarwuavk8uxxsrv97kr2.png" alt="Basic app relationships diagram using common imports for any ui domains folder" width="800" height="705"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Basic app relationships diagram using common imports for any ui domains folder&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Option 2 — without common_imports&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnpghnrwtcrga3kewk18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnpghnrwtcrga3kewk18.png" alt="Basic app relationships diagram without using common imports for any ui domains folder" width="800" height="641"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Basic app relationships diagram without using common imports for any ui domains folder&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note. Barrel File.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I find it very convenient to create barrel files on each top folder by exporting underlying classes in the same manner as Dart does for package export &lt;a href="https://dart.dev/tools/pub/create-packages" rel="noopener noreferrer"&gt;https://dart.dev/tools/pub/create-packages&lt;/a&gt;. This makes future refactoring easier and gives the ability to not mess with git changes when some file moves later.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Also, this practice makes it easier to think of all global folders as packages / libraries which are independent and may change their content, internal structure, but will maintain consistency with their external API.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;At the same time, currently I have no experience in how it affects the ability of deferred imports. &lt;a href="https://dart.dev/language/libraries#lazily-loading-a-library" rel="noopener noreferrer"&gt;https://dart.dev/language/libraries#lazily-loading-a-library&lt;/a&gt; I think at least you may expect that it will have no effect on this stage, but since it is a way to load libraries — it may become more effective with stage 4.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Second note. Domain Knowledge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ukikbuvrfkxjsfmzdon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ukikbuvrfkxjsfmzdon.png" alt="UI Domain relations &amp;amp; workflow example" width="800" height="518"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;UI Domain relations &amp;amp; workflow example&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Optionally, I recommend trying to place in all data and ui layer folders a Domain Knowledge file. It should be simple enough to regenerate and iterate with AI — this may give you context to work with particular domain features, develop, or maintain.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Semantically, to make it easy to get this context and navigate, it would be great if you align it with the above folder’s name, for example, if the folder above is ui_guide, then below you may place a file UI_GUIDE_CONTEXT.md or UI_GUIDE_KNOWLEDGE.md. The reason is simple: when you use file search — you will be able to quickly find this file, when you communicate with AI tool — you will much faster find required context.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Now let’s take a note on semantics.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxchlowp54o1z5ehgb18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxchlowp54o1z5ehgb18.png" alt="Visual representation of layers separation, its relations and building order" width="800" height="481"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Visual representation of layers separation, its relations and building order&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;First, the whole data layer has a prefix &lt;em&gt;data&lt;/em&gt; for two reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;to keep it at the top of the lib folder, so we could easily access it&lt;/li&gt;
&lt;li&gt;to keep always in mind that it is a data layer only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Second, domains (or UI layer) have a prefix ui. This makes this layer&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;on visual and physical distance from the data layer&lt;/li&gt;
&lt;li&gt;stack all ui related domains together.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While it may seem an over-engineering attempt, defining the organization of data and ui layers &lt;em&gt;visually distinctive&lt;/em&gt; from each other, will affect how you develop your application, because you will see it differently — more from an end-user perspective.&lt;/p&gt;

&lt;p&gt;Finally, let’s summarize all words into graphics:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abstract code structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/
├── pubspec.yaml  // &amp;lt;- define workspace to use the whole space as monorepo https://dart.dev/tools/pub/workspaces
├── apps/
│   └── &lt;span class="o"&gt;{&lt;/span&gt;platform&lt;span class="o"&gt;}&lt;/span&gt;_app/  // &amp;lt;- platform can be replaced by your first target platform, &lt;span class="k"&gt;for &lt;/span&gt;example mobile_app
│       ├── core/
│       │   ├── core.dart
│       │   ├── utils/
│       │   ├── extensions/
│       │   ├── hooks/
│       │   ├── l10n/
│       │   └── services/
│       ├── data_local_api/
│       ├── data_remote_api/
│       ├── data_repositories/
│       ├── data_models/
│       │   ├── api_dto/
│       │   └── &lt;span class="o"&gt;{&lt;/span&gt;domain&lt;span class="o"&gt;}&lt;/span&gt;_models/
│       ├── data_states/
│       ├── di/
│       ├── ui_root/
│       ├── ui_kit/
│       │   ├── ui_kit.dart  // &amp;lt;- place ui kit initially as a folder of mobile_app to keep initial simplicity
│       │   ├── UI_KIT_README.md
│       │   ├── atoms/
│       │   │   └── ATOM_README.md
│       │   └── molecules/
│       │       └── MOLECULES_README.md
│       ├── ui_&lt;span class="o"&gt;{&lt;/span&gt;domain&lt;span class="o"&gt;}&lt;/span&gt;/
│       │   ├── &lt;span class="o"&gt;{&lt;/span&gt;DOMAIN&lt;span class="o"&gt;}&lt;/span&gt;_KNOWLEDGE.md
│       │   ├── &lt;span class="o"&gt;{&lt;/span&gt;flow&lt;span class="o"&gt;}&lt;/span&gt;/
│       │   │   └── &lt;span class="o"&gt;{&lt;/span&gt;feature_name&lt;span class="o"&gt;}&lt;/span&gt;/
│       ├── envs.dart
│       ├── router.dart
│       ├── common_imports.dart
│       └── &lt;span class="o"&gt;{&lt;/span&gt;platform&lt;span class="o"&gt;}&lt;/span&gt;_app.dart
└── prototypes/
    └── &lt;span class="o"&gt;{&lt;/span&gt;prototype_name&lt;span class="o"&gt;}&lt;/span&gt;/
        └── idea.md  // This file contains the initial ideas and AI-generated insights &lt;span class="k"&gt;for &lt;/span&gt;the prototype.
    └── prompts/
        ├── agents/
        │   └── &lt;span class="o"&gt;{&lt;/span&gt;name&lt;span class="o"&gt;}&lt;/span&gt;_agent.md
        └── ideas/
            ├── &lt;span class="o"&gt;{&lt;/span&gt;idea&lt;span class="o"&gt;}&lt;/span&gt;_gen.md
            └── &lt;span class="o"&gt;{&lt;/span&gt;idea&lt;span class="o"&gt;}&lt;/span&gt;.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example code structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/
├── pubspec.yaml
├── apps/
│   └── mobile_app/
│       ├── core/
│       │   ├── core.dart
│       │   ├── utils/
│       │   ├── extensions/
│       │   ├── hooks/
│       │   ├── l10n/
│       │   └── services/
│       ├── data_local_api/
│       ├── data_remote_api/
│       ├── data_repositories/
│       ├── data_models/
│       │   ├── data_models.dart
│       │   ├── api_dto/
│       │   ├── payments_models/
│       │   ├── chat_models/
│       │   └── profile_models/
│       ├── data_states/
│       │   ├── data_states.dart
│       │   ├── app_settings_notifier.dart
│       │   └── user_profile_cubit.dart
│       ├── di/
│       │   ├── di.dart
│       │   ├── dependency_injector.dart
│       │   ├── global_initializer.dart
│       │   ├── global_state_initializer.dart
│       │   └── global_state_providers.dart
│       ├── ui_root/
│       │   ├── ui_root.dart
│       │   ├── app_scaffold.dart
│       │   └── bootstrap.dart
│       ├── ui_kit/
│       │   ├── ui_kit.dart
│       │   ├── UI_KIT_README.md
│       │   ├── atoms/
│       │   │   ├── atoms.dart
│       │   │   ├── ATOM_README.md
│       │   │   ├── ui_text_field.dart
│       │   │   ├── ui_icon.dart
│       │   │   └── ui_badge.dart
│       │   └── molecules/
│       │       ├── molecules.dart
│       │       ├── MOLECULES_README.md
│       │       ├── ui_search_field.dart
│       │       ├── ui_app_bar.dart
│       │       └── ui_animated_grid.dart
│       ├── ui_payments/
│       │   ├── ui_payments.dart
│       │   ├── PAYMENTS_KNOWLEDGE.md
│       │   ├── transactions_flow/
│       │   │   ├── transactions_screen.dart
│       │   │   ├── features/ // consider making this name adaptive&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;a screen lacks features, it may not need them. If features are complex, naming them may be more efficient than grouping them.
│       │   │   │   ├── transactions_list.dart
│       │   │   │   └── edit_transaction_popup.dart
│       │   └── pay/
│       │       ├── pay_screen.dart
│       │       ├── qr_pay/
│       │       │   ├── &lt;span class="k"&gt;*&lt;/span&gt;
│       │       │   └── qr_pay_feature.dart
│       │       ├── provider_pay/
│       │       │   ├── &lt;span class="k"&gt;*&lt;/span&gt;
│       │       │   └── provider_pay.dart
│       │       └── crypto_provider_pay/
│       │           ├── &lt;span class="k"&gt;*&lt;/span&gt;
│       │           └── crypto_provider_pay.dart
│       ├── ui_profile/
│       │   ├── ui_profile.dart
│       │   ├── PROFILE_KNOWLEDGE.md
│       │   ├── auth/
│       │   └── settings/
│       ├── envs.dart
│       ├── router.dart
│       └── mobile_app.dart
└── prototypes/
    ├── flutter/todo_with_amazing_animation/
    │   └── idea.md
    ├── typescript_yjs_prototype/
    │   └── idea.md
    ├── dart_frog_server/
    │   └── idea.md
    └── just_cool_feature/
        └── idea.md
/prompts/
├── agents/
│   ├── flutter_agent.md
│   ├── flutter_architector_agent.md
│   └── rust_agent.md
└── ideas/
    ├── charmed_animated_scroll_gen.md
    └── that_gradient_shader.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Personally, I find it difficult to nest flows too deep, so there we have two choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when the flow becomes too huge or feels logically complete — it seems more convenient to acknowledge it as a domain and move it on a global level as a domain.&lt;/li&gt;
&lt;li&gt;or break this flow into several flows, if it feels there is too much different functionality in one place.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think the most important part of this stage is to accumulate enough &lt;em&gt;Domain Knowledge&lt;/em&gt; before diving too deep into endless features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage 3 — Feature iterations.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Team: 2 Developers&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Main focus: test and try features for specific domains to make these domains logically complete.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While this part is quite small for changes — and may not contain any radical changes in structure, I think it’s quite important on this stage to follow two principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Keep refreshing, refining, and updating &lt;em&gt;domain knowledge&lt;/em&gt; from testing and using the application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep every small feature &lt;em&gt;implementation separate&lt;/em&gt; from the screen where it is placed. Treat the screen as a layout where you place widgets, and it would be much easier to reuse any feature-related widgets, as they will behave as self-contained micro applications.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;This ends the first three stages of thoughts about scalable architecture approach.&lt;/p&gt;

&lt;p&gt;Thank you for your time, to continue, use a link below.&lt;/p&gt;

&lt;p&gt;Please don’t forget to share your thoughts in comments:) it really helps the algorithms give this article to others to read, and it would be great support from you:)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-3-stages-3-5-4jd9"&gt;Next -&amp;gt; Stage 3,4,5 and Conclusion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev Architecture Series&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-intro-notes-jl2"&gt;Part 1 — Intro Notes — Previous&lt;/a&gt;&lt;br&gt;
Part 2 — Stage 1 and 2 — You are here:)&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/flutter-app-ai-centric-architecture-for-small-startups-part-3-stages-3-5-4jd9"&gt;Part 3 — Stage 3,4,5 and Conclusion Next&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/arenukvern/reimagine-libraries-management-as-apps-using-agentic-executable-framework-ami"&gt;Part 4 — Libraries as Agentic Executables&lt;/a&gt;&lt;br&gt;
Part 5 — Maintaining Libraries with AI Agents (planned)&lt;br&gt;
Part 6 — Building Foundation with Open Source in mind (planned)&lt;br&gt;
Part 7 — AI Project Bootstrapping (planned)&lt;br&gt;
Part 8 — Storage Layer as Reliability Foundation (planned)&lt;br&gt;
Part 9 — How to build for different Stores? (planned)&lt;br&gt;
Part 10 — Dev Ethics as Dev Cornerstone (Decision Making) (planned)&lt;br&gt;
Part 11 — Domain Knowledge (Agent Domain Context) (planned)&lt;br&gt;
Part 12 — Building Tests with AI Agents (planned)&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>architecture</category>
      <category>softwaredevelopment</category>
      <category>computerscience</category>
    </item>
  </channel>
</rss>
