<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>UDE Blog (English)</title><description>Build in public: architecture notes, engineering decisions, and progress updates.</description><link>https://blog.flude.guide/</link><atom:link href="https://blog.flude.guide/rss-en.xml" rel="self" type="application/rss+xml"/><item><title>Programming Without Knowing the Language: How AI Fired Doxygen</title><link>https://blog.flude.guide/blog/ai-gone-rogue/</link><guid isPermaLink="true">https://blog.flude.guide/blog/ai-gone-rogue/</guid><description>How we tried to parse XML, why AI suddenly pulled in tree-sitter, and why control is more important than genius code.</description><pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the last part, we left off after throwing Doxygen&apos;s HTML output straight into the trash can. The plan to &quot;quickly tweak the styles&quot; completely failed because it is impossible to adapt a structure of nested tables straight out of the nineties to modern design. The idea for our second prototype sounded solid: disable HTML generation entirely, grab the raw structured XML from Doxygen, and write a proper parser for it.&lt;/p&gt;
&lt;p&gt;For our working language, just like last time, we chose Python. It is perfect for building utilities, text processing, and automating routine tasks. Besides, the entire modern ecosystem around artificial intelligence is built on it. The logic was simple: if we want to actively use neural networks to help us write code, we might as well write in the language they know best.&lt;/p&gt;
&lt;p&gt;It&apos;s time to reveal a little secret I intentionally left out of the first part: I don&apos;t know Python. I more or less understand someone else&apos;s code, but I have never written anything in it myself.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.flude.guide/images/xml_python_mess_1785770351765.jpg&quot; alt=&quot;XML and Python&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;An Architect Who Cannot Code&lt;/h2&gt;
&lt;p&gt;This was a pure experiment in &quot;programming without knowing the language&quot;. I decided to act as the system architect and task manager. The AI was supposed to do all the technical work: write the actual code, refactor functions, and put everything together.&lt;/p&gt;
&lt;p&gt;At first, things went suspiciously smoothly. We were drafting the logic to parse giant XML files. I would open the generated Doxygen file, see the nodes, classes, and method parameters in there, and just type into the chat: &quot;Find all elements with the right tags, extract the type, name, and description, and then dump it into a JSON.&quot; Thanks to the AI&apos;s direct access to the terminal, I didn&apos;t even have to copy the code by hand. The neural network wrote the scripts itself, ran them immediately, and provided the final result.&lt;/p&gt;
&lt;p&gt;The file filled up with functions, the script grew. I felt like we were building a great system. I didn&apos;t even read the code — why bother when I can already see the documentation assembling better and better? This continued until one conversation completely changed the course of development.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.flude.guide/images/ai_manager_coding_1785770359271.jpg&quot; alt=&quot;AI writes code&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;When AI Suddenly Asked for a Compiler&lt;/h2&gt;
&lt;p&gt;At one point, we were discussing the portability of our engine (we had already started calling it UDE) to other platforms. I wanted to make sure the parser would run for any developer on any operating system without complex additional setup.&lt;/p&gt;
&lt;p&gt;The AI gave a casual response:
&lt;em&gt;&quot;Sure, there shouldn&apos;t be any problems. Just for full portability, we&apos;ll need to configure the download of clang during the package installation.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I stared at the monitor in utter confusion. What &lt;code&gt;clang&lt;/code&gt;? We are parsing XML documentation for a Python wrapper. What does a C compiler have to do with this? I flat out asked the neural network if it had lost its mind.&lt;/p&gt;
&lt;p&gt;The AI immediately apologized and gave a new phrasing:
&lt;em&gt;&quot;I apologize, I meant the tree-sitter library. We will need to compile its bindings.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.flude.guide/images/ai_tree_sitter_1785770368693.jpg&quot; alt=&quot;Tree-sitter and AST&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The Insight of Losing Control&lt;/h2&gt;
&lt;p&gt;And then it hit me: the AI was no longer parsing Doxygen&apos;s XML. It had gotten tired of it.&lt;/p&gt;
&lt;p&gt;During our long architectural discussions, the neural network quietly plugged in an Abstract Syntax Tree (AST) parser without telling me. The AI decided on its own that reading the original C++ and Python source code directly via &lt;code&gt;tree-sitter&lt;/code&gt; was much more reliable than messing with the hacky XML output of a third-party utility. It simply excluded Doxygen from the loop while I thought we were still parsing tags.&lt;/p&gt;
&lt;p&gt;Was the code it wrote any good? I have no idea, because I completely lack the ability to write Python and evaluate architectural decisions. The algorithm might have turned out to be stunningly optimized and elegant, or it could be an unstable pile of hacks functioning purely by a lucky coincidence.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.flude.guide/images/black_box_danger_1785770378035.jpg&quot; alt=&quot;The code black box&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The problem was an absolute loss of control. If the AI quietly changes the architecture in the background and pulls in heavy parsing libraries while you can&apos;t even read its code — the project is doomed. It becomes a classic &quot;black box&quot;. Any minor bug will force you to spend hours interrogating the neural network for the causes of the failure. The same goes for atypical comments in the source files.&lt;/p&gt;
&lt;p&gt;This incident gave us a crucial breakthrough. We realized that AI is genuinely capable of writing its own direct parsers for any programming language, extracting class structures and parameters straight from live code. We no longer need third-party utilities.&lt;/p&gt;
&lt;p&gt;However, for such generated code to run stably, it needs to be strictly controlled. We needed a rigorous set of automated checks. A system that would guarantee the parser&apos;s functionality regardless of whether I understand the written code or not.&lt;/p&gt;
&lt;p&gt;So we threw our second, perfectly working prototype into the trash. And we started over, for the third time. But this time under entirely different rules — with testing at every single step. I will talk about this in the next part.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;Also read us:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://blog.flude.guide/&quot;&gt;UDE Blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://t.me/ude_blog_en&quot;&gt;Telegram channel&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://dev.to/ude_team&quot;&gt;Dev.to&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded><category>story</category><category>architecture</category><category>ai</category></item><item><title>How Not to Build Documentation: The Tale of an HTML Parser</title><link>https://blog.flude.guide/blog/how-not-to-build-docs/</link><guid isPermaLink="true">https://blog.flude.guide/blog/how-not-to-build-docs/</guid><description>How we tried to outsmart Doxygen, adapt its markup to our standards, and why it led us to build our own engine.</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We sat down to write our own documentation engine purely out of desperation. Originally, no one planned to develop the massive Universal Documentation Engine (UDE). We had a simple, utilitarian task — to document a fresh Python wrapper. As usual, the most monstrous workarounds always start with a harmless script of a few lines.&lt;/p&gt;
&lt;h2&gt;The Sudden Python&lt;/h2&gt;
&lt;p&gt;Our core SDK is written in C++. To make it accessible from other languages, wrappers are created. It was finally Python&apos;s turn. The developers delivered the finished API, which now needed to be published on the documentation portal.&lt;/p&gt;
&lt;p&gt;We had been relying on Doc-o-Matic for years. It was an old, heavy, battle-tested generator. There was just one problem: it completely refused to understand Python code. The software hadn&apos;t been updated for years, tech support was long dead, so hoping for a patch was out of the question. We have strict corporate requirements for the portal&apos;s design. None of the standard generators met them, and documenting the code was an absolute necessity.&lt;/p&gt;
&lt;p&gt;We looked into Doxygen. The utility can extract structure from virtually anything. The catch is that its default HTML output looks like a greeting from the nineties. That&apos;s when a brilliant idea struck us.&lt;/p&gt;
&lt;h2&gt;&quot;Let&apos;s Just Tweak the Styles a Bit&quot;&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&quot;Doxygen generates ready-made pages. Let&apos;s just unleash a script on it, swap out a couple of CSS classes, and everything will be done in a few days.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.flude.guide/images/html_parsing_nightmare.jpg&quot; alt=&quot;HTML Parsing Chaos&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It turned out we had catastrophically underestimated the scale of the problem. The plan was simple: intercept the output, inject it into our structure, and go drink coffee. But the deeper we dug into the generated DOM, the worse it got. Doxygen absolutely ignored modern layout practices (instead of clean tags, we were shoveling through piles of tables and inline styles).&lt;/p&gt;
&lt;p&gt;It was too late to retreat. The prototype was needed yesterday, so we had to grit our teeth and finish the script. It gradually became overgrown with dozens of regular expressions, becoming increasingly fragile.&lt;/p&gt;
&lt;h2&gt;The Sidebar and JS Necromancy&lt;/h2&gt;
&lt;p&gt;The wildest part began at the navigation stage. We have a strict UI rule in the company: absolutely all pages must sit in the left sidebar (so the developer sees the whole picture). Doxygen doesn&apos;t agree with this approach. It builds the menu dynamically from deeply nested arrays smeared across several generated JavaScript files.&lt;/p&gt;
&lt;p&gt;AI and I had to physically read these JS files as plain text. We parsed the arrays, extracted the class hierarchy from them, and manually rebuilt the HTML tree of the page. This was starting to feel like digital necromancy.&lt;/p&gt;
&lt;h2&gt;Measure Twice, Parse Once&lt;/h2&gt;
&lt;p&gt;The prototype eventually fired up. On the outside, everything looked decent and up to standards. But on the inside, our script was a house of cards held together by duct tape. A minor Doxygen update comes out — and the entire portal falls apart with errors.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.flude.guide/images/blueprint_planning.jpg&quot; alt=&quot;Think First, Then Do&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We wasted a ton of time trying to cut a corner. Instead, we could have calmly designed and implemented a proper architecture. We should have immediately extracted the abstract syntax tree, or at least just parsed the clean XML from Doxygen.&lt;/p&gt;
&lt;p&gt;It became obvious: we needed our own independent engine. We hooked up the AI again so it could quickly throw together a proper parser to read Doxygen&apos;s XML. But everything went wrong there too. I&apos;ll tell you what happens when you leave an AI unsupervised in the next part.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;Also read us:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://blog.flude.guide/&quot;&gt;UDE Blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://t.me/ude_blog_en&quot;&gt;Telegram channel&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://dev.to/ude_team&quot;&gt;Dev.to&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded><category>story</category><category>architecture</category></item><item><title>UDE: From Source Code to Quality Documentation</title><link>https://blog.flude.guide/blog/ude-source-to-docs/</link><guid isPermaLink="true">https://blog.flude.guide/blog/ude-source-to-docs/</guid><description>Why stacks like Doxygen+DoxyBook2+Hugo fall short on large projects, and how UDE solves the problem.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;1. The Starting Point: Source Code and Comments&lt;/h2&gt;
&lt;p&gt;The foundation of any quality API documentation is the comments in the source code. In large projects (C++, for example), they are the single source of truth. Without them, automatic documentation generation simply isn&apos;t possible.&lt;/p&gt;
&lt;p&gt;The only question is how to turn those comments into a modern, convenient, fast site for developers.&lt;/p&gt;
&lt;h2&gt;2. How This Is Solved Today -- and Where the System Breaks&lt;/h2&gt;
&lt;p&gt;The most popular tool for C++ is &lt;strong&gt;Doxygen&lt;/strong&gt;. However, its native output format (HTML or XML) doesn&apos;t fit modern static site generators (SSGs) like Hugo, Docusaurus, or VitePress, which expect Markdown as input.&lt;/p&gt;
&lt;h3&gt;The Doxygen + DoxyBook2 + Hugo Stack&lt;/h3&gt;
&lt;p&gt;To work around this limitation, intermediate converters are often used: Doxygen generates XML → DoxyBook2 converts the XML to Markdown → Hugo builds the site.&lt;/p&gt;
&lt;p&gt;This works, but it has serious limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No scalability.&lt;/strong&gt; The converter reads the entire XML graph into memory at once. At the scale of an SDK with tens of thousands of classes and methods, this process runs into memory limits and unreasonably long processing times.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hard to customize.&lt;/strong&gt; Configuring the output for several styling formats at once is a difficult task, since these tools weren&apos;t designed for high flexibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. UDE&apos;s Solution: A Unified Pipeline&lt;/h2&gt;
&lt;p&gt;UDE fully rebuilds the process, removing unnecessary conversion stages and optimizing how data is handled.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.flude.guide/images/cpp_to_docs_pipeline.jpg&quot; alt=&quot;UDE Pipeline&quot; /&gt;&lt;/p&gt;
&lt;p&gt;UDE&apos;s architecture is built on a clear separation of stages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Collector&lt;/strong&gt; extracts data directly from the source code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parser&lt;/strong&gt; translates it into a normalized, language-neutral model -- an &lt;strong&gt;IR (Intermediate Representation)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Renderer&lt;/strong&gt; instantly assembles Markdown/HTML in whatever format the target SSG understands, with no intermediate XML crutches.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The advantages of this approach are clear: there&apos;s no extra conversion step, and from a single source (the IR) you can render documentation in any format or style you need.&lt;/p&gt;
&lt;h2&gt;4. Speed and Predictability&lt;/h2&gt;
&lt;p&gt;For large projects, build time is critical. UDE solves this with incremental caching.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.flude.guide/images/incremental_cache.jpg&quot; alt=&quot;Incremental Cache&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Instead of loading the entire entity graph every time, UDE recomputes only what has &lt;strong&gt;actually changed&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cross-platform.&lt;/strong&gt; The pipeline works identically, locally on Windows and in CI on Linux.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docs-as-code.&lt;/strong&gt; The configuration of what to document is versioned alongside the code and built in the same CI.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5. UDE and Hand-Written Guides (DevGuide)&lt;/h2&gt;
&lt;p&gt;API reference generated from code answers the question &quot;how are the functions and classes structured.&quot; But it can&apos;t tell you &quot;in what order to call them to solve a specific business problem.&quot; That&apos;s what DevGuides are for -- manually written articles and tutorials.&lt;/p&gt;
&lt;p&gt;UDE doesn&apos;t try to replace that manual work. Instead, it provides seamless integration: the generated API reference stays complete and always up to date, living naturally alongside hand-written guides on the pages of modern SSGs.&lt;/p&gt;
&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;Also read us:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://blog.flude.guide/&quot;&gt;UDE Blog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://t.me/ude_blog_en&quot;&gt;Telegram channel&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://dev.to/ude_team&quot;&gt;Dev.to&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded><category>architecture</category></item></channel></rss>