{"id":2514,"date":"2025-05-16T15:26:56","date_gmt":"2025-05-16T15:26:56","guid":{"rendered":"https:\/\/techtrendfeed.com\/?p=2514"},"modified":"2025-05-16T15:26:56","modified_gmt":"2025-05-16T15:26:56","slug":"constructing-customized-tooling-with-llms","status":"publish","type":"post","link":"https:\/\/techtrendfeed.com\/?p=2514","title":{"rendered":"Constructing Customized Tooling with LLMs"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div>\n<p>Instruments that deal with diagrams as code, similar to PlantUML, are invaluable for speaking<br \/>\n            complicated system habits. Their text-based format simplifies versioning, automation, and<br \/>\n            evolving architectural diagrams alongside code. In my work explaining distributed<br \/>\n            methods, PlantUML&#8217;s sequence diagrams are significantly helpful for capturing interactions<br \/>\n            exactly.<\/p>\n<p>Nevertheless, I usually wished for an extension to stroll by means of these diagrams step-by-step,<br \/>\n            revealing interactions sequentially fairly than displaying the whole complicated stream at<br \/>\n            as soon as\u2014like a slideshow for execution paths. This need displays a standard developer<br \/>\n            state of affairs: wanting personalised extensions or inner instruments for their very own wants.<\/p>\n<p>But, extending established instruments like PlantUML usually includes vital preliminary<br \/>\n            setup\u2014parsing hooks, construct scripts, viewer code, packaging\u2014sufficient \u201cplumbing\u201d to<br \/>\n            deter speedy prototyping. The preliminary funding required to start can suppress good<br \/>\n            concepts.<\/p>\n<p>That is the place Massive Language Fashions (LLMs) show helpful. They&#8217;ll deal with boilerplate<br \/>\n            duties, liberating builders to give attention to design and core logic. This text particulars how I<br \/>\n            used an LLM to construct <code>PlantUMLSteps<\/code>, a small extension including step-wise<br \/>\n            playback to PlantUML sequence diagrams. The objective is not simply the software itself, however<br \/>\n            illustrating the method how syntax design, parsing, SVG era, construct automation,<br \/>\n            and an HTML viewer had been iteratively developed by means of a dialog with an LLM,<br \/>\n            turning tedious duties into manageable steps.<\/p>\n<section id=\"DiagramAsCode-APlantumlPrimer\">\n<h2>Diagram as code &#8211; A PlantUML primer<\/h2>\n<p>Earlier than diving into the event course of, let&#8217;s briefly introduce PlantUML<br \/>\n                for individuals who may be unfamiliar. PlantUML is an open-source software that enables<br \/>\n                you to create UML diagrams from a easy text-based description language. It<br \/>\n                helps<br \/>\n                numerous diagram varieties together with sequence, class, exercise, part, and state<br \/>\n                diagrams.<\/p>\n<p>The facility of PlantUML lies in its capability to model management diagrams<br \/>\n                as plain textual content, combine with documentation methods, and automate diagram<br \/>\n                era inside growth pipelines. That is significantly precious for<br \/>\n                technical documentation that should evolve alongside code.<\/p>\n<p>This is a easy instance of a sequence diagram in PlantUML syntax:<\/p>\n<pre>@startuml\n\nconceal footbox\n\nactor Person\nparticipant System\nparticipant Database\n\nPerson -&gt; System: Login Request\nSystem --&gt; Person: Login Type\n\nPerson -&gt; System: Submit Credentials\nSystem -&gt; Database: Confirm Credentials\nDatabase --&gt; System: Validation Consequence\nSystem --&gt; Person: Authentication Consequence\n\nPerson -&gt; System: Request Dashboard\nSystem -&gt; Database: Fetch Person Information\nDatabase --&gt; System: Person Information\nSystem --&gt; Person: Dashboard View\n@enduml <\/pre>\n<p>When processed by PlantUML, this textual content generates a visible sequence diagram displaying the<br \/>\n            interplay between parts.<\/p>\n<div class=\"figure \" id=\"https:\/\/martinfowler.com\/articles\/exploring-gen-ai\/user-authentication.png\"><img decoding=\"async\" src=\"https:\/\/martinfowler.com\/articles\/exploring-gen-ai\/user-authentication.png\" \/><\/p>\n<\/div>\n<p>                The code-like nature of PlantUML makes<br \/>\n                it simple to be taught and use, particularly for builders who&#8217;re already comfy<br \/>\n                with text-based instruments.<\/p>\n<p>This simplicity is what makes PlantUML an ideal candidate for extension. With the<br \/>\n                proper tooling, we will improve its capabilities whereas sustaining its text-based<br \/>\n                workflow.<\/p>\n<p>\n                Our objective for this venture is to create a software which might divide the<br \/>\n                sequence diagram into steps and generate a step-by-step view of the diagram.<br \/>\n                So for the above diagram, we should always be capable of view login, authentication and<br \/>\n                dashboard<br \/>\n                steps one after the other.\n            <\/p>\n<\/section>\n<section id=\"Step2BuildingTheParserLogicandDebugging\">\n<h2>Step 2: Constructing the Parser Logic (and Debugging)<\/h2>\n<div class=\"prompt\">\n<p>\u201cNow we have to parse the plantuml information and separate out step. Every time we<br \/>\n                    encounter a step marker, we create a step object and maintain including the following strains<br \/>\n                    to it till we encounter one other step marker or finish of file. In case we<br \/>\n                    encounter one other step counter, we create new step object, it ought to have all<br \/>\n                    the consists of, actors and individuals from the earlier step. It must also<br \/>\n                    have all of the content material of the earlier step, until the step metadata has<br \/>\n                    &#8216;newPage&#8217; attribute. If there are not any step markers encountered, which is the case<br \/>\n                    the place we&#8217;ve information with out steps, it ought to create a default step. Create a<br \/>\n                    StepParser to parse given puml information and create checklist of steps.\u201d<\/p>\n<\/div>\n<p>Claude generated the preliminary code for a StepParser class and a Step mannequin class to<br \/>\n                deal with parsing PlantUML information with step markers. The preliminary implementation had some<br \/>\n                logical points:<\/p>\n<ul>\n<li>Incorrect dealing with of step content material inheritance when newPage attribute was false<\/li>\n<li>Improper dealing with of declarations (actors, individuals) showing earlier than the<br \/>\n                    first step marker<\/li>\n<li>Points with making a default step for information with out markers<\/li>\n<\/ul>\n<p>The Cursor editor was working in Agent mode, so after working assessments and figuring out<br \/>\n                these points by means of the failure messages, Claude offered a corrected model that<br \/>\n                correctly dealt with:<\/p>\n<ul>\n<li>Content material collected earlier than step one marker<\/li>\n<li>Inheritance of content material from the instantly previous step<\/li>\n<li>World monitoring of declarations throughout steps<\/li>\n<li>Correct creation of a default step for information with out markers<\/li>\n<\/ul>\n<p>With these corrections, the parser efficiently handed all assessments.<\/p>\n<p> The following step was to generate a gradle job. <\/p>\n<p>\n                    We want gradle job which might course of puml information in src\/diagrams and its sub<br \/>\n                folders. For every file it ought to create a listing with the title of the file the place<br \/>\n                it generates legitimate puml file for every step. It could actually generate that by simply including<br \/>\n                @startuml at the beginning and @enduml on the finish of the step content material.<\/p>\n<div class=\"response\">\n<p>I will show you how to create a Gradle job to course of PlantUML information and generate<br \/>\n                step-by-step diagrams. First, let&#8217;s create the duty in<br \/>\n                construct.gradle:<\/p>\n<pre>\/\/ Course of every .puml file within the enter listing and its subdirectories\nfileTree(inputDir).embrace('**\/*.puml').every { pumlFile -&gt;\n    def relativePath = inputDir.toPath().relativize(pumlFile.toPath()).toString()\n    def fileName = pumlFile.title.exchange('.puml', '')\n    def stepOutputDir = new File(outputDir, fileName)\n    \n    if (!stepOutputDir.exists()) {\n        stepOutputDir.mkdirs()\n    }\n    \n    \/\/ Run the generator for this file\n    javaexec {\n        classpath = sourceSets.primary.runtimeClasspath\n        mainClass = 'com.instance.StepDiagramGenerator'\n        args = [pumlFile.absolutePath, stepOutputDir.absolutePath]\n    }<\/pre>\n<\/div>\n<p> Claude additionally helped producing a easy plantuml sequence diagram to check the gradle<br \/>\n                job. The identical one which we used originally of the article.\n            <\/p>\n<p>\n            The gradle job wanted a category PlantUMLGenerator which<br \/>\n            can generate SVGs for every step.<br \/>\n            Cursor within the Agent mode generated the code for the category.\n            <\/p>\n<p> It then ran the construct to confirm the duty. <\/p>\n<div class=\"response fit\">\n<pre>Let's run a check to verify our implementation works: cd \/Customers\/unmeshjoshi\/work\/plantumlsequence &amp;&amp; .\/gradlew clear construct\n                \nActivity :generateStepDiagrams\nGenerated step diagram: \/Customers\/unmeshjoshi\/work\/plantumlsteps\/construct\/generated-diagrams\/user-authentication\/step-01-step-1-user-login.puml\nGenerated step diagram: \/Customers\/unmeshjoshi\/work\/plantumlsteps\/construct\/generated-diagrams\/user-authentication\/step-02-step-2-authentication.puml\nGenerated step diagram: \/Customers\/unmeshjoshi\/work\/plantumlsteps\/construct\/generated-diagrams\/user-authentication\/step-03-step-3-dashboard.puml\nGenerated step stream abstract: \/Customers\/unmeshjoshi\/work\/plantumlsteps\/construct\/generated-diagrams\/user-authentication\/abstract.puml\n\n        BUILD SUCCESSFUL in 543ms\n        3 actionable duties: 3 executed\n\n<\/pre>\n<\/div>\n<\/section>\n<section id=\"Step3GeneratingHtmlViewerForStepSequence\">\n<h2>Step 3: Producing HTML Viewer for Step Sequence<\/h2>\n<p> The following step was to generate a easy HTML viewer that can be utilized to view the step<br \/>\n                sequence. <\/p>\n<p>\n                        Now we have to generate a HTML viewer for the step information to be proven one after the other.<br \/>\n                    The HTML viewer can have a view space the place we present the svg picture generated for every<br \/>\n                    step with the step title within the metadata for that step. We will have subsequent and former<br \/>\n                    buttons to point out subsequent and former step picture.\n                <\/p>\n<p>\n                    I will show you how to create an HTML viewer for the step diagrams. We&#8217;ll must: Generate<br \/>\n                    SVG information from the PlantUML information Create an HTML viewer with navigation controls<br \/>\n                    Replace the Gradle job to generate each PlantUML and SVG information, together with the HTML<br \/>\n                    viewer First, let&#8217;s create a easy HTML template for the viewer:<br \/>\n                    &#8230;.<\/p>\n<p>\n                The agent mode found out a number of points with the template however auto-fixed it by<br \/>\n                working some corrective actions.\n            <\/p>\n<p> This setup allowed us to shortly generate step diagrams from a single PlantUML file,<br \/>\n                and look at them in a step-by-step method. So the above diagram might be seen as a<br \/>\n                sequence of following steps:<\/p>\n<div class=\"figure \" id=\"https:\/\/martinfowler.com\/articles\/exploring-gen-ai\/user-authentication-step-1.png\"><img decoding=\"async\" src=\"https:\/\/martinfowler.com\/articles\/exploring-gen-ai\/user-authentication-step-1.png\" \/><\/p>\n<\/div>\n<div class=\"figure \" id=\"https:\/\/martinfowler.com\/articles\/exploring-gen-ai\/user-authentication-step-2.png\"><img decoding=\"async\" src=\"https:\/\/martinfowler.com\/articles\/exploring-gen-ai\/user-authentication-step-2.png\" \/><\/p>\n<\/div>\n<div class=\"figure \" id=\"https:\/\/martinfowler.com\/articles\/exploring-gen-ai\/user-authentication-step-3.png\"><img decoding=\"async\" src=\"https:\/\/martinfowler.com\/articles\/exploring-gen-ai\/user-authentication-step-3.png\" \/><\/p>\n<\/div>\n<\/section>\n<section id=\"TheCodeIsTheSourceOfTruth\">\n<h2>The Code is the Supply of Reality<\/h2>\n<p>The place to go from right here? <\/p>\n<p>Whereas the prompts and the LLM assistant (on this case, interacting in an agent-like<br \/>\n                mode, using fashions like Claude Sonnet) offered a remarkably efficient approach to<br \/>\n                generate a working first model of <code>PlantUMLSteps<\/code>, it is essential to<br \/>\n                acknowledge the character of this generated output.<\/p>\n<ul>\n<li><b>Prompts aren&#8217;t Deterministic:<\/b> The prompts utilized in our dialog had been<br \/>\n                    efficient for this interplay, however they can&#8217;t be handled as the last word<br \/>\n                    &#8216;supply of reality&#8217;. The identical prompts given to a unique mannequin, and even the identical<br \/>\n                    mannequin at a later date, aren&#8217;t assured to supply the very same output due<br \/>\n                    to the inherent variability in LLM era. <\/li>\n<li><b>Code Requires Administration:<\/b> The generated code is the supply of reality for<br \/>\n                    the software&#8217;s performance. As such, it must be handled like another<br \/>\n                    software program artifact &#8211; checked into model management, reviewed, examined, and<br \/>\n                    maintained.<\/li>\n<li><b>Evaluate for Habitability:<\/b> It is important to revisit the LLM-generated code<br \/>\n                    after the preliminary creation part. Is it &#8216;liveable&#8217;? That&#8217;s, is it moderately<br \/>\n                    simple to learn, perceive, and modify by a human developer? Whereas the LLM helped<br \/>\n                    overcome preliminary hurdles and boilerplate, making certain the long-term maintainability<br \/>\n                    and readability of the codebase usually requires human evaluation and potential<br \/>\n                    refactoring. The objective is code that not solely works however can be developed<br \/>\n                    successfully over time.<\/li>\n<\/ul>\n<p>\n                Prompting in pure language (like English) to generate code works properly within the<br \/>\n                early phases of growth\u2014while you&#8217;re exploring concepts, scaffolding performance,<br \/>\n                or getting aware of a brand new software or framework. However as your system begins to take<br \/>\n                form, the boundaries of imprecise or broad prompts grow to be obvious. At this stage, what&#8217;s<br \/>\n                wanted isn&#8217;t extra code era, however conceptual modeling\u2014utilizing the constructs of<br \/>\n                your programming language or expertise stack to precisely signify the area.<br \/>\n                This stage wants deeper considering to construct abstractions, and an alignment between<br \/>\n                code construction and area ideas\u2014one thing solely achievable by means of considerate<br \/>\n                design, not simply prompting. If prompt-based code era with out<br \/>\n                evaluation known as \u201cvibe coding,\u201d then the extra disciplined strategy might be<br \/>\n                known as \u201cAI-assisted structured coding.\u201d.\n            <\/p>\n<\/section>\n<section id=\"BeyondCodeGenerationTheDeveloperInsightInRefactoring\">\n<h2>Past Code Technology: The Developer Perception in Refactoring<\/h2>\n<p>\n                The following step was to refactor the code to make it extra readable and maintainable.\n            <\/p>\n<p>Initially, the parse methodology was a protracted, monolithic perform that dealt with all the things<br \/>\n                from<br \/>\n                detecting step markers to managing declarations and content material. The code was tough<br \/>\n                to<br \/>\n                perceive and keep.\n            <\/p>\n<p>\n                The total code is obtainable in<br \/>\n                 <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/github.com\/unmeshjoshi\/PlantUmlSteps\/commit\/c50eafe0eef2dd97a56cd60a55baf69869994fc8#diff-01bd69bfbdde13cd432f55629e3c850c00ab6907b88cf8c5314a9aa645546ed3\"> this preliminary commit on GitHub<\/a>.\n            <\/p>\n<p>\n                The `StepParser.java` parse methodology wants refactoring. It ought to signify ideas<br \/>\n                used within the requirement or area ideas and comply with customary clear code practices<br \/>\n                with intentional methodology names and code that reads like a DSL.\n            <\/p>\n<p>This preliminary request was open-ended, indicating that the developer acknowledged the<br \/>\n                want for enchancment however was on the lookout for steerage on how one can strategy it.<br \/>\n                The LLM responded with a complete refactoring that launched a number of new<br \/>\n                lessons and strategies:\n            <\/p>\n<div class=\"response fit\">\n<pre>- Launched `PlantUmlDocument` to signify the doc being parsed\n- Smaller, extra targeted strategies with intention-revealing names\n- Higher encapsulation of associated behaviors\n- Extra expressive variable and methodology names\n\n\n    \/**\n     * Represents a PlantUML doc being parsed, managing state throughout parsing\n     *\/\n    non-public class PlantUmlDocument {\n        non-public ultimate Listing<step> steps = new ArrayList&lt;&gt;();\n        non-public ultimate Listing<string> declarations = new ArrayList&lt;&gt;();\n        non-public ultimate Listing<string> contentBeforeFirstStep = new ArrayList&lt;&gt;();\n        non-public Step currentStep = null;\n        non-public boolean hasStepMarkers = false;\n        \n        public void beginNewStep(StepMetadata metadata) {\n            hasStepMarkers = true;\n            \n            \/\/ Save the present step if it exists\n            if (currentStep != null) {\n                steps.add(currentStep);\n            }\n            \n            \/\/ Create a brand new step\n            currentStep = new Step(metadata.getName(), metadata.isNewPage(), metadata.getAttributes());\n            \n            \/\/ Add all declarations to the brand new step\n            currentStep.addAllDeclarations(declarations);\n            \n            \/\/ If this is not a brand new web page and we've earlier steps, copy all content material from earlier steps\n            if (!metadata.isNewPage() &amp;&amp; !steps.isEmpty()) {\n                carryOverPreviousStepsContent();\n            }\n        }\n        \n        non-public void carryOverPreviousStepsContent() {\n            for (Step previousStep : steps) {\n                for (String contentLine : previousStep.getContent()) {\n                    currentStep.addContent(contentLine);\n                }\n            }\n        }\n        \n        public void addDeclaration(String line) {\n            declarations.add(line);\n            \n            if (currentStep != null) {\n                currentStep.addDeclaration(line);\n            } else {\n                contentBeforeFirstStep.add(line);\n            }\n        }\n        \n        public void addContentLine(String line) {\n            if (currentStep != null) {\n                currentStep.addContent(line);\n            } else if (!line.trim().isEmpty()) {\n                contentBeforeFirstStep.add(line);\n            }\n        }\n        \n        public void finalizeDocument() {\n            \/\/ Add the final step if it exists and hasn't been added but\n            if (currentStep != null) {\n                steps.add(currentStep);\n            }\n        }\n<\/string><\/string><\/step><\/pre>\n<\/div>\n<p>\n                The total code is obtainable in<br \/>\n                 <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/github.com\/unmeshjoshi\/PlantUmlSteps\/commit\/661002fcede7ec70eac2b41309fb9423d14c4ca1\"> this commit on GitHub<\/a>.\n            <\/p>\n<p>\n                The `contentBeforeFirstStep` in `PlantUmlDocument.java` is used just for creating<br \/>\n                default step when there are not any step markers?<br \/>\n                So we will presumably<br \/>\n                do two go processing the place we first verify if there are step markers.. if there<br \/>\n                are.. we do step-based processing. Or else we simply create a default step and add all<br \/>\n                declarations and content material. That may take away the necessity to have `contentBeforeFirstStep`<br \/>\n                We will additionally possibily title PlantUmlDocument as `ParsedPumlFile` which represents<br \/>\n                the parsed puml file.\n            <\/p>\n<p>\n                The LLM carried out this suggestion with a two-pass strategy. It additionally renamed the<br \/>\n                 PlantUmlDocument as ParsedPumlFile.<br \/>\n                 The total code is obtainable in<br \/>\n                 <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/github.com\/unmeshjoshi\/PlantUmlSteps\/commit\/f57500915039824fc2bf3f010f0dc914f363114f\"> this commit on GitHub<\/a>.\n            <\/p>\n<p>\n                `ParsedPumlFile` might be higher represented as builder sample.<br \/>\n                `StepBuilder` generally is a builder for `Step` objects.\n            <\/p>\n<p>\n                This perception demonstrated the developer&#8217;s capability to acknowledge design patterns,<br \/>\n                noting that the refactored class adopted the Builder sample.\n            <\/p>\n<p> The ultimate refactoring represents a big enchancment over the unique code: <\/p>\n<pre>class StepBuilder {\n    non-public ultimate Listing<step> steps = new ArrayList&lt;&gt;();\n    non-public ultimate Listing<string> globalDeclarations = new ArrayList&lt;&gt;();\n    non-public Step currentStep = null;\n    \n    public void startNewStep(StepMetadata metadata) {\n        if (currentStep != null) {\n            steps.add(currentStep);\n        }\n        \n        currentStep = new Step(metadata);\n        currentStep.addAllDeclarations(globalDeclarations);\n        \n        if (!metadata.isNewPage() &amp;&amp; !steps.isEmpty()) {\n            \/\/ Copy content material from the earlier step\n            Step previousStep = steps.get(steps.dimension() - 1);\n            for (String contentLine : previousStep.getContent()) {\n                currentStep.addContent(contentLine);\n            }\n        }\n    }\n    \n    public void addDeclaration(String declaration) {\n        globalDeclarations.add(declaration);\n        \n        if (currentStep != null) {\n            currentStep.addDeclaration(declaration);\n        }\n    }\n    \n    public void addContent(String content material) {\n        \/\/ If no step has been began but, create a default step\n        if (currentStep == null) {\n            StepMetadata metadata = new StepMetadata(\"Default Step\", false, new HashMap&lt;&gt;());\n            startNewStep(metadata);\n        }\n        \n        currentStep.addContent(content material);\n    }\n    \n    public Listing<step> construct() {\n        if (currentStep != null) {\n            steps.add(currentStep);\n        }\n        \n        return new ArrayList&lt;&gt;(steps);\n    }\n} \n<\/step><\/string><\/step><\/pre>\n<p>\n                The total code is obtainable in<br \/>\n                 <a rel=\"nofollow\" target=\"_blank\" href=\"https:\/\/github.com\/unmeshjoshi\/PlantUmlSteps\/commit\/6b0a305d42da3df4d3d0b783926fa6e7b19045cd\"> this commit on GitHub<\/a>.\n            <\/p>\n<p>\n                There are extra enhancements attainable,<br \/>\n                however I&#8217;ve included a number of to display the character of collaboration between LLMs<br \/>\n                and builders.\n            <\/p>\n<\/section>\n<section id=\"Conclusion\">\n<h2>Conclusion<\/h2>\n<p> Every a part of this extension\u2014remark syntax, Java parsing logic, HTML viewer, and<br \/>\n                    Gradle wiring\u2014began with a targeted LLM immediate. Some elements required some professional<br \/>\n                    developer steerage to LLM, however the important thing profit was with the ability to discover and<br \/>\n                    validate concepts with out getting slowed down in boilerplate. LLMs are significantly<br \/>\n                    useful when you&#8217;ve a design in thoughts however aren&#8217;t getting began due to<br \/>\n                    the efforts wanted for establishing the scaffolding to attempt it out. They can assist<br \/>\n                    you generate working glue code, combine libraries, and generate small<br \/>\n                    UIs\u2014leaving you to give attention to whether or not the concept itself works.\n                <\/p>\n<p>\n                    After the preliminary working model, it was essential to have a developer to information<br \/>\n                    the LLM to enhance the code, to make it extra maintainable. It was vital<br \/>\n                    for builders to:\n                <\/p>\n<ul>\n<li>Ask insightful questions<\/li>\n<li>Problem proposed implementations<\/li>\n<li>Counsel various approaches<\/li>\n<li>Apply software program design ideas<\/li>\n<\/ul>\n<p>This collaboration between the developer and the LLM is essential to constructing<br \/>\n                        maintainable and scalable methods. The LLM can assist generate working code,<br \/>\n                        however the developer is the one who could make it extra readable, maintainable and<br \/>\n                        scalable.\n                    <\/p>\n<\/section>\n<hr class=\"bodySep\" \/>\n<\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>Instruments that deal with diagrams as code, similar to PlantUML, are invaluable for speaking complicated system habits. Their text-based format simplifies versioning, automation, and evolving architectural diagrams alongside code. In my work explaining distributed methods, PlantUML&#8217;s sequence diagrams are significantly helpful for capturing interactions exactly. Nevertheless, I usually wished for an extension to stroll by [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":2516,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[56],"tags":[475,2451,1112,2452],"class_list":["post-2514","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software","tag-building","tag-custom","tag-llms","tag-tooling"],"_links":{"self":[{"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/posts\/2514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2514"}],"version-history":[{"count":1,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/posts\/2514\/revisions"}],"predecessor-version":[{"id":2515,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/posts\/2514\/revisions\/2515"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=\/wp\/v2\/media\/2516"}],"wp:attachment":[{"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/techtrendfeed.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}<!-- This website is optimized by Airlift. Learn more: https://airlift.net. Template:. Learn more: https://airlift.net. Template: 69d9690a190636c2e0989534. Config Timestamp: 2026-04-10 21:18:02 UTC, Cached Timestamp: 2026-05-14 21:28:49 UTC -->