<?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: tdk-cli</title>
    <description>The latest articles on DEV Community by tdk-cli (@tdk-cli).</description>
    <link>https://dev.to/tdk-cli</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4145557%2F6879342a-c388-4b5e-818b-aa736b779196.png</url>
      <title>DEV Community: tdk-cli</title>
      <link>https://dev.to/tdk-cli</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tdk-cli"/>
    <language>en</language>
    <item>
      <title>tdk</title>
      <dc:creator>tdk-cli</dc:creator>
      <pubDate>Sun, 18 Oct 2026 20:48:48 +0000</pubDate>
      <link>https://dev.to/tdk-cli/tdk-330l</link>
      <guid>https://dev.to/tdk-cli/tdk-330l</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzj5jum5pupif2g2140zw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzj5jum5pupif2g2140zw.png" alt=" " width="800" height="940"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Must Read for Vibe Coders: The Five Habits That Separate a Demo From a Product</title>
      <dc:creator>tdk-cli</dc:creator>
      <pubDate>Sun, 18 Oct 2026 19:56:41 +0000</pubDate>
      <link>https://dev.to/tdk-cli/must-read-for-vibe-coders-the-five-habits-that-separate-a-demo-from-a-product-32ee</link>
      <guid>https://dev.to/tdk-cli/must-read-for-vibe-coders-the-five-habits-that-separate-a-demo-from-a-product-32ee</guid>
      <description>&lt;p&gt;If you vibe-code, read this before you share anything you built. An agent can produce a working app in an afternoon. What it cannot do is check that the app works on a second machine, with a second person, or after a restart. That gap is where most vibe-coded projects break, and it is what these five habits close.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Run it from a clean copy
&lt;/h2&gt;

&lt;p&gt;Your machine has things the repository does not: a global tool, an old environment variable, a file you never committed. Clone the project into an empty folder, follow the README, and run it. If it fails, the problem is real, and you found it before a user did.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Keep secrets out of the code and the chat
&lt;/h2&gt;

&lt;p&gt;Agents often copy an example key into real code, and a key pasted into a prompt goes to a third party. Put every secret in an environment file that git ignores, read it at runtime, and rotate anything that has been exposed. A deleted commit does not undo a copy.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Read what changed before you accept it
&lt;/h2&gt;

&lt;p&gt;You did not write most of the code, so you need a way to check it. Read the list of changed files first, then the summary, then the diff for anything that touches data, money, login, or secrets. Ask the agent what each change does in plain words, and treat a vague answer as a reason to look closer.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Test the failure, not only the success
&lt;/h2&gt;

&lt;p&gt;A demo shows the happy path. Try an empty form, text where a number belongs, and a request while a dependency is down. The app should answer with a clear message, not a crash or a blank page. Write one test for each failure you can think of, and make sure the test fails when the behaviour breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Keep the local setup in one place
&lt;/h2&gt;

&lt;p&gt;If your app has more than one service, such as a frontend, an API, and a database, the start order and the ports matter. Describe the services in one place, start them with one command, and check their readiness before you test a flow. TDK CLI is one way to do this for local multi-service apps: &lt;code&gt;tdk doctor --json&lt;/code&gt; checks whether the machine can run the stack, &lt;code&gt;tdk up main --dry-run&lt;/code&gt; shows the plan, and &lt;code&gt;tdk status --json&lt;/code&gt; reports readiness. It is for local development, and production stays with your existing deployment tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you share it
&lt;/h2&gt;

&lt;p&gt;Run through the five habits once. Then ask one person to use the app without your help, and watch where they get stuck. That moment is the most useful test you will get.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep this page
&lt;/h2&gt;

&lt;p&gt;Bookmark it, and read it again before each launch. The habits are short, and they are the ones that save the most time later.&lt;/p&gt;

</description>
      <category>funny</category>
      <category>discuss</category>
      <category>community</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Drift Checks in TDK CLI: Fail Fast, Generator Changes, and Catching Hand Edits Before Commit</title>
      <dc:creator>tdk-cli</dc:creator>
      <pubDate>Sun, 18 Oct 2026 19:23:10 +0000</pubDate>
      <link>https://dev.to/tdk-cli/drift-checks-in-tdk-cli-fail-fast-generator-changes-and-catching-hand-edits-before-commit-4jne</link>
      <guid>https://dev.to/tdk-cli/drift-checks-in-tdk-cli-fail-fast-generator-changes-and-catching-hand-edits-before-commit-4jne</guid>
      <description>&lt;p&gt;A drift check answers one question: has someone changed a generated file by hand? TDK runs that check before Tilt starts, so a hand edit stops the start before anything is built. A reader asked two follow-up questions, and this article answers them from the source: what happens when the generator itself changes, and whether the check should also run before commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the check decides
&lt;/h2&gt;

&lt;p&gt;The check compares each generated file under &lt;code&gt;.autogenerated/&lt;/code&gt; with its snapshot in &lt;code&gt;.autogenerated/.tdk-contract/&lt;/code&gt;. The snapshot is the copy TDK wrote the last time it generated that file. The comparison is a byte-for-byte match on the file contents.&lt;/p&gt;

&lt;p&gt;Only one kind of difference counts as drift. If a generated file differs from its snapshot, it was edited by hand, and &lt;code&gt;tdk up&lt;/code&gt; stops and lists it. The fix the message offers is &lt;code&gt;tdk config regenerate&lt;/code&gt; to discard the edits, or &lt;code&gt;tdk up --ignore-drift&lt;/code&gt; to skip the check.&lt;/p&gt;

&lt;p&gt;A different kind of difference is not drift. If &lt;code&gt;service.json&lt;/code&gt; changed since the outputs were written, the outputs are stale, and &lt;code&gt;tdk up&lt;/code&gt; regenerates them. That is the normal edit-then-start loop.&lt;/p&gt;

&lt;p&gt;The service.yaml file is exempt. It is a runtime projection with timestamps, so it has no snapshot to compare.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does a generator change look like drift?
&lt;/h2&gt;

&lt;p&gt;The question is whether a legitimate change to a template or generator is flagged. From the code, the answer is no, and the reason is worth understanding.&lt;/p&gt;

&lt;p&gt;The check has no notion of a generator version. It never asks which generator produced a file. It only asks whether the file on disk matches the snapshot written at the last generation. If the generator changed, the new output and the new snapshot are written together, so they still match. The check passes.&lt;/p&gt;

&lt;p&gt;I did not run this against a real generator change, so treat it as a reading of the code rather than a tested result. It has one consequence worth knowing. A file that an older generator wrote still matches its snapshot, so the check passes even though the current generator would produce something different. Staleness is invisible to this check. Only a hand edit, which differs from the snapshot, is flagged.&lt;/p&gt;

&lt;p&gt;What this means in practice: upgrading TDK does not raise a false alarm. Equally, the check does not warn you that a generator upgrade changed your output. Review the diff after an upgrade, the same way you would review any dependency change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fail fast, and why it matters
&lt;/h2&gt;

&lt;p&gt;Running the check before Tilt starts is the design choice a reader praised, and it is worth stating why. A check after the build finds the problem minutes later, after images have been built with the edited file. Checking first costs nothing and points at the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should it run before commit?
&lt;/h2&gt;

&lt;p&gt;The reader suggested a pre-commit check, so that a hand-edited generated file never reaches git. That is a sound idea, and TDK already has the pieces.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tdk config verify&lt;/code&gt; checks the wider generated project and compares the generated service files with their snapshots. &lt;code&gt;tdk doctor&lt;/code&gt; covers local readiness and discovered service problems. The repo's contributor guidance keeps those two distinct, so a pre-commit hook should call &lt;code&gt;tdk config verify&lt;/code&gt;, not &lt;code&gt;tdk doctor&lt;/code&gt;, when it is checking generated files.&lt;/p&gt;

&lt;p&gt;Two things to settle first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Whether generated files are committed.&lt;/strong&gt; If &lt;code&gt;.autogenerated/&lt;/code&gt; is ignored by git, a hand edit never reaches the repository, and the pre-commit check guards only your local copy. Check your &lt;code&gt;.gitignore&lt;/code&gt; before you decide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whether snapshots are committed.&lt;/strong&gt; The snapshots must travel with the project for a teammate's check to mean anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A sketch of the pre-commit step
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tdk config verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it from the project root in a git pre-commit hook, and make it fail the commit when it exits non-zero. Keep the hook fast, since it runs on every commit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The drift check compares each generated file with the snapshot from its last generation. It blocks a start on a hand edit, not on a stale output. It does not flag a legitimate generator change, and it cannot see that an output is stale after a generator upgrade, so review generator upgrades yourself. Before commit, &lt;code&gt;tdk config verify&lt;/code&gt; is the right command to call, and the first question to answer is whether your generated files are committed at all.&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>devops</category>
      <category>tdk</category>
      <category>architecture</category>
    </item>
    <item>
      <title>What Really Happens to Your Data When You Type tdk up: A Sequence Diagram With the Database</title>
      <dc:creator>tdk-cli</dc:creator>
      <pubDate>Sun, 18 Oct 2026 19:21:20 +0000</pubDate>
      <link>https://dev.to/tdk-cli/what-really-happens-to-your-data-when-you-type-tdk-up-a-sequence-diagram-with-the-database-2nhn</link>
      <guid>https://dev.to/tdk-cli/what-really-happens-to-your-data-when-you-type-tdk-up-a-sequence-diagram-with-the-database-2nhn</guid>
      <description>&lt;p&gt;The earlier diagrams followed the containers. Most real problems in a local stack are about data: a table that is missing, a seed that ran twice, a database that came back empty. This article extends the &lt;code&gt;tdk up&lt;/code&gt; sequence to cover the database, so you can see where the data lives and what each step does to it.&lt;/p&gt;

&lt;p&gt;The facts below come from TDK's data guide, which records what was run against a real Postgres container, and from the open issues. Where something is not verified, the article says so, and the diagram marks those steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  The sequence
&lt;/h2&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
    autonumber
    actor Dev as Developer
    participant CLI as tdk CLI
    participant Tilt as Tilt
    participant PG as Postgres container (one per project)
    participant Vol as Named volume
    participant Mig as migrator resource
    participant Seed as seed job (optional)
    participant API as API service (per stack)

    Dev-&amp;gt;&amp;gt;CLI: tdk up
    CLI-&amp;gt;&amp;gt;Tilt: start the project
    Tilt-&amp;gt;&amp;gt;PG: start project_postgres on host port 15432 or TDK_POSTGRES_PORT
    PG-&amp;gt;&amp;gt;Vol: mount database-management_project_postgres_data
    Vol--&amp;gt;&amp;gt;PG: existing data reused, or empty on first run
    PG--&amp;gt;&amp;gt;Tilt: ready to accept connections

    Note over Tilt,PG: DATABASE_URL points each service at project_stack

    Tilt-&amp;gt;&amp;gt;Mig: run migrations once, in their own resource
    Mig-&amp;gt;&amp;gt;PG: apply pending migrations in order
    PG--&amp;gt;&amp;gt;Mig: applied migrations recorded
    Mig--&amp;gt;&amp;gt;Tilt: done

    opt seed job is declared
        Tilt-&amp;gt;&amp;gt;Seed: run seed as one-shot job, restart no
        Seed-&amp;gt;&amp;gt;PG: insert fake data
        Note over Seed,PG: order against migrator and API not verified yet
    end

    Tilt-&amp;gt;&amp;gt;API: start after dependencies
    API-&amp;gt;&amp;gt;PG: connect with DATABASE_URL
    PG--&amp;gt;&amp;gt;API: queries served
    API--&amp;gt;&amp;gt;Tilt: health route answers

    Dev-&amp;gt;&amp;gt;CLI: tdk down
    CLI-&amp;gt;&amp;gt;Tilt: tear down
    Tilt-&amp;gt;&amp;gt;PG: remove the container
    Note over PG,Vol: the named volume is kept, so the data survives&lt;/code&gt;&lt;/pre&gt;



&lt;h2&gt;
  
  
  What lives where
&lt;/h2&gt;

&lt;p&gt;TDK runs one Postgres container for the whole project. The container is named after the project, such as &lt;code&gt;my_shop_postgres&lt;/code&gt;. Each stack gets its own database inside it, named from the project and the stack. Services in the same stack share that database, through the &lt;code&gt;DATABASE_URL&lt;/code&gt; in their generated configuration.&lt;/p&gt;

&lt;p&gt;The data sits in a named volume. The data guide checked that &lt;code&gt;tdk down&lt;/code&gt; removes the container but keeps the volume, so the next &lt;code&gt;tdk up&lt;/code&gt; starts Postgres on the same data. That is the most useful fact in this article, and also the most surprising one, because a fresh container does not mean a fresh database.&lt;/p&gt;

&lt;p&gt;The host port defaults to 15432, or whatever &lt;code&gt;TDK_POSTGRES_PORT&lt;/code&gt; says. The data guide gives 15432 as the host port, and an earlier scratch run chose it when 5432 was taken.&lt;/p&gt;

&lt;h2&gt;
  
  
  The migrator
&lt;/h2&gt;

&lt;p&gt;Migrations run in their own resource, the migrator, which the repo's contributor guidance requires for new examples. It starts after Postgres is ready and before the API. Migrations are applied once, in order, and the migration tool records which ones have run, so a restart does not reapply them. The exact recording depends on the migration tool you choose.&lt;/p&gt;

&lt;p&gt;If the database comes back empty after a reset, the migrator runs again on the next &lt;code&gt;tdk up&lt;/code&gt;, or when you restart the migrator resource in Tilt. An empty database is not an error. It is the state before the migrations run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seeding
&lt;/h2&gt;

&lt;p&gt;A seed loads fake data for development. The data guide suggests two options. A SQL file applied by hand is fine for a pilot. A one-shot resource is the other option: the seed runs as a bring-your-own job with &lt;code&gt;--restart no&lt;/code&gt;, the same way as a migration.&lt;/p&gt;

&lt;p&gt;The guide also says the order of the seed, the migrator, and the API is not verified. The safe answer is to make the seed idempotent, so running it in a different order does no harm. The open issue that would make startup order explicit for Postgres is &lt;a href="https://github.com/tdk-landscape/tdk-cli-core/issues/531" rel="noopener noreferrer"&gt;#531&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Keep seed data fake. Never put production data in the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resetting the data
&lt;/h2&gt;

&lt;p&gt;Two resets are covered by the guide. To reset everything, stop the stack, remove the volume, and start again. To reset one stack, drop and recreate its database while Postgres is running, using &lt;code&gt;DROP DATABASE ... WITH (FORCE)&lt;/code&gt; so the service disconnects first.&lt;/p&gt;

&lt;p&gt;Each reset has a cost. Removing the volume deletes every stack's data. Dropping one database deletes only that stack's data, but the services in that stack lose their state until the migrator runs again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snapshot and restore
&lt;/h2&gt;

&lt;p&gt;The guide also describes a snapshot and restore for one database. Take the snapshot before a risky change, and test the restore once. A backup you have never restored is a guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the diagram does not show
&lt;/h2&gt;

&lt;p&gt;It does not show the exact order of the seed, the migrator, and the API, because that order is not verified in the guide. It does not show how a migration tool such as Prisma, Drizzle, Atlas, or Dbmate runs its own steps, since that depends on your choice. And it assumes one Postgres per project, which is how the data guide describes TDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;One &lt;code&gt;tdk up&lt;/code&gt; starts one Postgres for the project, mounts a volume that outlives the container, runs the migrator once, optionally runs a seed, and then starts the API against its stack's database. &lt;code&gt;tdk down&lt;/code&gt; removes the container and keeps the data. Read the volume, not the container, when you ask where your data went.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>postgres</category>
      <category>database</category>
      <category>devplusplus</category>
    </item>
    <item>
      <title>What Really Happens When You Type tdk resource: A Sequence Diagram of Scaffolding</title>
      <dc:creator>tdk-cli</dc:creator>
      <pubDate>Sun, 18 Oct 2026 19:19:16 +0000</pubDate>
      <link>https://dev.to/tdk-cli/what-really-happens-when-you-type-tdk-resource-a-sequence-diagram-of-scaffolding-32o8</link>
      <guid>https://dev.to/tdk-cli/what-really-happens-when-you-type-tdk-resource-a-sequence-diagram-of-scaffolding-32o8</guid>
      <description>&lt;p&gt;The earlier sequence diagram followed &lt;code&gt;tdk up&lt;/code&gt;. This one follows the command you run before any of that: &lt;code&gt;tdk resource&lt;/code&gt;, which creates a new service. It is the step where a project gets its first source files, so it is worth knowing what happens in order.&lt;/p&gt;

&lt;p&gt;The steps below follow what I saw when I ran the command in a scratch project, and the provider and template structure in the repo. The messages are summaries of real output, so check exact wording against your version.&lt;/p&gt;

&lt;h2&gt;
  
  
  The sequence
&lt;/h2&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
    autonumber
    actor Dev as Developer
    participant CLI as tdk CLI (TypeScript)
    participant Root as Project root finder
    participant Prov as Framework or language provider
    participant Tpl as Templates and generator
    participant FS as Project folder on disk
    participant Disc as Discovery paths in .tdk/project.json

    Dev-&amp;gt;&amp;gt;CLI: tdk resource storefront-web --type frontend -y
    CLI-&amp;gt;&amp;gt;Root: find .tdk/project.json from here upward
    alt no project found
        Root--&amp;gt;&amp;gt;CLI: not found
        CLI--&amp;gt;&amp;gt;Dev: error, run tdk project --yes first
    else project found
        Root--&amp;gt;&amp;gt;CLI: project root and config
        CLI-&amp;gt;&amp;gt;CLI: validate name, type, framework, and stack
        CLI-&amp;gt;&amp;gt;Prov: ask for starter files for the chosen framework
        Prov--&amp;gt;&amp;gt;CLI: package.json, entry file, component, test, tsconfig
        CLI-&amp;gt;&amp;gt;Tpl: fill the Dockerfile and service.json
        Tpl--&amp;gt;&amp;gt;CLI: rendered files
        CLI-&amp;gt;&amp;gt;Disc: check the target path against discovery paths
        alt path outside discovery
            Disc--&amp;gt;&amp;gt;CLI: services/*/* is the default, apps/ is not scanned
            CLI-&amp;gt;&amp;gt;FS: place the resource under services/&amp;lt;stack&amp;gt;/&amp;lt;name&amp;gt;
            CLI--&amp;gt;&amp;gt;Dev: placed here instead of apps/, use --path to choose
        else path inside discovery
            CLI-&amp;gt;&amp;gt;FS: write files under the chosen folder
        end
        FS--&amp;gt;&amp;gt;CLI: files written
        CLI--&amp;gt;&amp;gt;Dev: resource created, next steps: bun install, tdk up &amp;lt;stack&amp;gt;
    end

    Note over Dev,FS: Generated runtime files under .autogenerated are not written here
    Dev-&amp;gt;&amp;gt;CLI: tdk up main --dry-run
    CLI--&amp;gt;&amp;gt;Dev: plan shows the new service, no containers started&lt;/code&gt;&lt;/pre&gt;



&lt;h2&gt;
  
  
  The steps that matter
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The project root.&lt;/strong&gt; The command searches upward for &lt;code&gt;.tdk/project.json&lt;/code&gt;. Run it outside a project and it stops with a clear message, and the fix is &lt;code&gt;tdk project --yes&lt;/code&gt; first. Creating a project and adding a resource are separate steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The checks.&lt;/strong&gt; The CLI validates the name, the resource type, the framework, and the stack before it writes anything. A bad combination is rejected here, not after files have been created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The provider.&lt;/strong&gt; The framework or language provider owns the starter files: a &lt;code&gt;package.json&lt;/code&gt;, an entry file, a component, and a test for a frontend. TypeScript providers write these, not templates. This is why the frontend scaffold and the Rust scaffold look different.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The placement check.&lt;/strong&gt; This is the step that surprised me most. The command compares the target folder with the discovery paths in &lt;code&gt;.tdk/project.json&lt;/code&gt;. In the default setup those paths are &lt;code&gt;services/*/*&lt;/code&gt;, so a resource requested under &lt;code&gt;apps/&lt;/code&gt; would never be started by &lt;code&gt;tdk up&lt;/code&gt;. The CLI places it under &lt;code&gt;services/&amp;lt;stack&amp;gt;/&amp;lt;name&amp;gt;&lt;/code&gt; and tells you why. The &lt;code&gt;--path&lt;/code&gt; option overrides the choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The files on disk.&lt;/strong&gt; The resource folder receives its source files and a &lt;code&gt;service.json&lt;/code&gt;. The runtime files are not written here. They appear later, when Tilt loads the project and the engine generates the &lt;code&gt;.autogenerated&lt;/code&gt; folder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to look next
&lt;/h2&gt;

&lt;p&gt;After the command, &lt;code&gt;tdk up main --dry-run&lt;/code&gt; shows the new service in the plan without starting containers. The first sequence diagram covers what happens at that point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common surprises
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The resource is not where you asked.&lt;/strong&gt; Check the message for the placement reason, and use &lt;code&gt;--path&lt;/code&gt; if you need another location.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;tdk up&lt;/code&gt; does not see the new service.&lt;/strong&gt; Check that the folder is inside a discovery path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The frontend needs its dependencies installed.&lt;/strong&gt; The next-steps output says so. Run the install before the first start.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;tdk resource&lt;/code&gt; is a short chain: find the project, check the inputs, ask a provider for starter files, render the manifest, check the placement, and write the folder. Most surprises come from the placement step, so read its message before you assume the files went where you wanted.&lt;/p&gt;

</description>
      <category>tdk</category>
      <category>community</category>
      <category>discuss</category>
      <category>ai</category>
    </item>
    <item>
      <title>Bookmark It: Stop Shipping Broken Vibe Code (Round Two): 10 More Checks Before Launch</title>
      <dc:creator>tdk-cli</dc:creator>
      <pubDate>Sun, 18 Oct 2026 18:23:31 +0000</pubDate>
      <link>https://dev.to/tdk-cli/bookmark-it-stop-shipping-broken-vibe-code-round-two-10-more-checks-before-launch-1bka</link>
      <guid>https://dev.to/tdk-cli/bookmark-it-stop-shipping-broken-vibe-code-round-two-10-more-checks-before-launch-1bka</guid>
      <description>&lt;p&gt;Your demo works. Good. Now give the app to someone who did not build it.&lt;/p&gt;

&lt;p&gt;That is where most vibe-coded projects fall apart. Not because the agent was careless, but because the demo never tested the things that only show up on a second machine, with a second person, or after a restart. Bookmark these ten checks and run them before you call the app ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The lockfile matches the manifest
&lt;/h2&gt;

&lt;p&gt;Run the exact install command your CI runs, on a clean copy. Agents edit the manifest and forget to regenerate the lockfile. The result is a build that passes on your laptop and fails in the pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Every outbound call has a timeout
&lt;/h2&gt;

&lt;p&gt;A call with no limit waits forever when the other side stalls. Give each one a deadline, and check what the user sees when it expires.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Errors are readable
&lt;/h2&gt;

&lt;p&gt;Send an empty form, text where a number belongs, and an oversized value. The app should answer with a message a person can act on, not a stack trace or a blank screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Nothing secret is in the repo
&lt;/h2&gt;

&lt;p&gt;Search the diff for keys and connection strings. Move every value to the environment. Confirm the environment file is git-ignored with &lt;code&gt;git status&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The database starts before the code that needs it
&lt;/h2&gt;

&lt;p&gt;An API that boots before its database accepts connections fails its first request in a confusing way. Declare the order. In TDK CLI, &lt;code&gt;dependsOn&lt;/code&gt; in &lt;code&gt;service.json&lt;/code&gt; sets it, and &lt;code&gt;tdk up main --dry-run&lt;/code&gt; prints the start order without starting anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Migrations run once, in their own step
&lt;/h2&gt;

&lt;p&gt;A migration in your app's startup runs on every restart, and two instances can run it at once. Move it to a separate step that runs before the app. TDK CLI runs migrations in a &lt;code&gt;migrator&lt;/code&gt; resource, and &lt;code&gt;tdk doctor&lt;/code&gt; warns when a service runs one from its start script.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Generated files are never hand-edited
&lt;/h2&gt;

&lt;p&gt;A Dockerfile or routing file you change by hand is overwritten by the next generation, quietly. Change the source and regenerate. TDK CLI compares its generated files with saved snapshots before &lt;code&gt;tdk up&lt;/code&gt; starts, so a hand edit stops the start and names the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. The health check tells the truth
&lt;/h2&gt;

&lt;p&gt;A route that returns 200 every time says the process is alive, not that the service works. Check what the service actually needs, and keep the check cheap enough to run often.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. A teammate can start it from a clean clone
&lt;/h2&gt;

&lt;p&gt;Clone into an empty folder, follow your README, and run one command. If it fails, your app depends on something that only lives on your laptop. Find it, and write it down.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. You can read the failure
&lt;/h2&gt;

&lt;p&gt;Stop the database on purpose. Throw an error in one route. Remove one environment variable. The log should say what broke and where. If it doesn't, fix that before anyone else sees the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Run all ten once. Most vibe-coded projects pass the first few and fail on the last few. The fixes are small, and each one saves a conversation you would rather not have.&lt;/p&gt;

&lt;p&gt;For a multi-service app, the local stack is where most of the second-machine problems show up. With TDK CLI, start with &lt;code&gt;tdk doctor --json&lt;/code&gt; to confirm the machine can run it, then &lt;code&gt;tdk up&lt;/code&gt;, then &lt;code&gt;tdk status --json&lt;/code&gt; until everything reports ready. If something fails, &lt;code&gt;tdk logs --json --service &amp;lt;name&amp;gt; --tail 200&lt;/code&gt; shows the first error.&lt;/p&gt;

&lt;p&gt;Your demo is not the product. The demo that survives a clean clone and a teammate's laptop is.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>code</category>
      <category>programming</category>
    </item>
    <item>
      <title>For Empowering the TDK Community</title>
      <dc:creator>tdk-cli</dc:creator>
      <pubDate>Sun, 18 Oct 2026 18:09:31 +0000</pubDate>
      <link>https://dev.to/tdk-cli/for-empowering-the-tdk-community-2587</link>
      <guid>https://dev.to/tdk-cli/for-empowering-the-tdk-community-2587</guid>
      <description>&lt;p&gt;I want to share where TDK CLI stands and invite you to take part in it. This is not a launch and it is not a finished product. It is a working tool with real users, real gaps, and a public list of work that needs hands.&lt;/p&gt;

&lt;h2&gt;
  
  
  What TDK CLI is
&lt;/h2&gt;

&lt;p&gt;TDK CLI is a command-line tool that runs a multi-service application on your machine. You describe each service in a &lt;code&gt;service.json&lt;/code&gt; file, and TDK generates the Docker and Tilt files from those descriptions and starts the stack with &lt;code&gt;tdk up&lt;/code&gt;. It is for local development. Production deployment stays with tools such as Helm, Argo CD, or Kustomize.&lt;/p&gt;

&lt;p&gt;The core CLI is MIT-licensed and needs no key to run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is honest about its state
&lt;/h2&gt;

&lt;p&gt;The README describes TDK as 1.x for local development. That means the core commands and the &lt;code&gt;service.json&lt;/code&gt; model are in use, and the project still changes. Some areas are marked as opt-in, such as the Go and Rust language providers, and some premium features need a license key. Check the docs for the feature you plan to use before you depend on it.&lt;/p&gt;

&lt;p&gt;The project publishes its open issues, and a good number are labelled for newcomers. Treat the tracker as the honest record of what is unfinished.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does day to day
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scaffold services.&lt;/strong&gt; &lt;code&gt;tdk resource &amp;lt;name&amp;gt; --type &amp;lt;type&amp;gt;&lt;/code&gt; creates frontends, backends, workers, MCP servers, and other resource types.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start the stack.&lt;/strong&gt; &lt;code&gt;tdk up&lt;/code&gt; builds and runs the services, and &lt;code&gt;tdk up &amp;lt;stack&amp;gt;&lt;/code&gt; starts one part of a larger system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check before it starts.&lt;/strong&gt; &lt;code&gt;tdk doctor --json&lt;/code&gt; reports whether the machine can run the stack. &lt;code&gt;tdk up main --dry-run&lt;/code&gt; shows the plan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch it run.&lt;/strong&gt; &lt;code&gt;tdk status --json&lt;/code&gt; reports readiness, &lt;code&gt;tdk logs --json&lt;/code&gt; gives recent output, and &lt;code&gt;tdk ui&lt;/code&gt; opens a terminal dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work with agents.&lt;/strong&gt; &lt;code&gt;tdk mcp&lt;/code&gt; runs a local Model Context Protocol server, so an assistant can start the stack and read its status.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ways to take part
&lt;/h2&gt;

&lt;p&gt;If you use TDK, tell us what you built. A short note in the community discussions helps the next person decide whether the tool fits their work.&lt;/p&gt;

&lt;p&gt;If you write about it, link to the repository and the docs, and say what you tried. Accurate posts are the most useful ones.&lt;/p&gt;

&lt;p&gt;If you want to contribute code, start with the labels. Documentation and translation issues are the usual first step, and tests come next. The contributing guide explains the sign-off rule: every commit needs a &lt;code&gt;Signed-off-by&lt;/code&gt; line, added with &lt;code&gt;git commit -s&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you maintain a project that uses TDK, add it to the list of adopters, so the next team can see who else runs it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ways to help without writing code
&lt;/h2&gt;

&lt;p&gt;Report a bug with the exact command, the output, and your version. Improve a translation. Try the example repositories, such as the ERP example, and tell us which part confused you. Read the docs and note where they are unclear.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we are still working on
&lt;/h2&gt;

&lt;p&gt;Some of the work is visible in the issue tracker: better error messages, more tests, and clearer documentation for newcomers. Some of it is harder, such as keeping generated files consistent across many services. We would rather say that plainly than promise a date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Join us
&lt;/h2&gt;

&lt;p&gt;Pick one thing from this list and do it this week. Open an issue, fix a typo, or try a stack you have never run. The community is only as useful as the people who show up with something specific to say.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks to everyone who has already opened an issue, sent a pull request, or written about TDK.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>news</category>
      <category>discuss</category>
      <category>community</category>
    </item>
    <item>
      <title>The Bank App Architecture Diagram: How a Retail Banking Stack Could Run Locally With TDK CLI</title>
      <dc:creator>tdk-cli</dc:creator>
      <pubDate>Sun, 18 Oct 2026 18:03:55 +0000</pubDate>
      <link>https://dev.to/tdk-cli/the-bank-app-architecture-diagram-how-a-retail-banking-stack-could-run-locally-with-tdk-cli-3jna</link>
      <guid>https://dev.to/tdk-cli/the-bank-app-architecture-diagram-how-a-retail-banking-stack-could-run-locally-with-tdk-cli-3jna</guid>
      <description>&lt;p&gt;Banking apps are a good test of an architecture diagram, because every box has a rule attached. Accounts must never go negative without a rule allowing it, a transfer must happen once and only once, and customers must see only their own data. This article draws one reference layout for a retail banking app and shows how TDK CLI could run its services locally.&lt;/p&gt;

&lt;p&gt;This is an illustrative design. It is not taken from a real bank, and the repository on my machine has no bank application. The only banking service in the ERP example is &lt;code&gt;banking-integration-api&lt;/code&gt;, which is a finance-side bank connection, not a customer-facing app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not use this for real money without a security review and the compliance work your jurisdiction requires.&lt;/strong&gt; A local stack with fake accounts is a teaching tool, not a bank.&lt;/p&gt;

&lt;h2&gt;
  
  
  The diagram
&lt;/h2&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    CUST["Customer on a phone or browser"]
    OPS["Bank operator console"]

    subgraph EDGE["Edge: frontends and gateway"]
        WEB["web-banking-app: frontend"]
        OPSAPP["ops-console-app: frontend"]
        GW["Traefik gateway with TLS in production"]
    end

    subgraph IDENT["Identity and access"]
        AUTH["auth-api: login, sessions, MFA hooks"]
        CUSTDATA["customer-profile-api"]
    end

    subgraph CORE["Core banking services"]
        ACCTS["accounts-api: balances and account types"]
        LEDGER["ledger-api: double-entry postings"]
        TRANS["transfers-api: idempotent transfers"]
        CARDS["cards-api: card status and limits"]
    end

    subgraph RISK["Risk and rules"]
        FRAUD["fraud-rules-api: scoring and holds"]
        LIMITS["limits-api: daily and per-transfer limits"]
    end

    subgraph INTEG["Integrations"]
        PAYS["payments-gateway-api: external rails"]
        NOTIFY["notifications-api: email and SMS"]
    end

    subgraph JOBS["Background work"]
        STMT["statements-worker: monthly statements"]
        RECON["reconciliation-worker: match external settlements"]
    end

    subgraph DATA["Data and messaging"]
        PG[("PostgreSQL: one database per domain")]
        NATS["NATS: transfer and posting events"]
    end

    subgraph AUDIT["Audit and observability"]
        AUDLOG["audit-log-api: append-only record"]
        TRACE["traces and logs with correlation IDs"]
    end

    CUST --&amp;gt; WEB
    OPS --&amp;gt; OPSAPP
    WEB --&amp;gt; GW
    OPSAPP --&amp;gt; GW

    GW --&amp;gt; AUTH
    GW --&amp;gt; CUSTDATA
    GW --&amp;gt; ACCTS
    GW --&amp;gt; TRANS
    GW --&amp;gt; CARDS

    AUTH --&amp;gt; CUSTDATA
    TRANS --&amp;gt; FRAUD
    TRANS --&amp;gt; LIMITS
    TRANS --&amp;gt; LEDGER
    TRANS --&amp;gt; PAYS
    LEDGER --&amp;gt; ACCTS
    CARDS --&amp;gt; LIMITS

    TRANS --&amp;gt; NATS
    LEDGER --&amp;gt; NATS
    NATS --&amp;gt; NOTIFY
    NATS --&amp;gt; AUDLOG
    NATS --&amp;gt; RECON
    STMT --&amp;gt; LEDGER

    ACCTS --&amp;gt; PG
    LEDGER --&amp;gt; PG
    TRANS --&amp;gt; PG
    CUSTDATA --&amp;gt; PG
    AUDLOG --&amp;gt; PG

    CORE --&amp;gt; AUDLOG
    CORE -.-&amp;gt; TRACE
    AUTH -.-&amp;gt; TRACE

    classDef money fill:#e8fbef,stroke:#15803d,color:#0f172a
    classDef risk fill:#fdecec,stroke:#b91c1c,color:#0f172a
    classDef audit fill:#fff4e5,stroke:#c2410c,color:#0f172a
    class LEDGER,TRANS,ACCTS,CARDS money
    class FRAUD,LIMITS risk
    class AUDLOG,TRACE audit&lt;/code&gt;&lt;/pre&gt;



&lt;h2&gt;
  
  
  How to read it
&lt;/h2&gt;

&lt;p&gt;Customers and operators reach the system through two frontends. Both pass through one gateway, which in production would terminate TLS and handle authentication before a request reaches a service.&lt;/p&gt;

&lt;p&gt;The core services are the money path. The ledger records every movement as a double-entry posting, so each transfer debits one account and credits another, and the books always balance. Transfers go through the fraud and limit checks before they post. Idempotency matters here: a retried transfer must not move money twice, so the transfers service keys each request.&lt;/p&gt;

&lt;p&gt;Events on NATS carry transfers and postings to the services that react to them: notifications, the audit log, and reconciliation. Statement generation reads from the ledger on a schedule, as a background worker.&lt;/p&gt;

&lt;p&gt;The audit log is append-only. Nothing in the diagram writes to it except the event flow, and nothing edits or deletes its rows. Traces and logs carry a correlation ID, so a single transfer can be followed across services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mapping it to TDK CLI
&lt;/h2&gt;

&lt;p&gt;In a TDK project, each box in the diagram becomes a resource. The frontends are &lt;code&gt;frontend&lt;/code&gt; resources, the APIs are &lt;code&gt;backend&lt;/code&gt; resources, and the statements and reconciliation jobs are &lt;code&gt;worker&lt;/code&gt; resources. Each gets a &lt;code&gt;service.json&lt;/code&gt;, and &lt;code&gt;dependsOn&lt;/code&gt; declares the order: the database first, then the ledger, then the transfers service that posts to it.&lt;/p&gt;

&lt;p&gt;TDK runs the local stack and checks it before startup. The drift check stops a hand edit to generated files, the dry run prints the start order, and readiness output shows which services are up. Those checks help a team keep the local system consistent. They do not make the design safe.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tdk up main &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
tdk status &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What the diagram does not cover
&lt;/h2&gt;

&lt;p&gt;It leaves out the controls a real bank needs: customer identity verification, regulatory reporting, key management, backup and disaster recovery, penetration testing, and the rules for storing account data. Each of those needs a specialist, and none is solved by a diagram.&lt;/p&gt;

&lt;p&gt;It also says nothing about performance. A transfer service under load is a different problem from a transfer service on a laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;A retail banking app is a set of services around a double-entry ledger, with transfers, limits, fraud checks, an append-only audit log, and events that connect them. Drawn as one diagram, it shows where the money moves and where the checks sit. Use it to teach the layout and to build a local sandbox with fake accounts. Anything closer to production needs a security review and the compliance work that applies where you operate.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>backend</category>
      <category>architecture</category>
      <category>discuss</category>
    </item>
    <item>
      <title>The ERP Architecture Diagram: Seven Domains, One Local Stack</title>
      <dc:creator>tdk-cli</dc:creator>
      <pubDate>Sun, 18 Oct 2026 17:43:09 +0000</pubDate>
      <link>https://dev.to/tdk-cli/the-erp-architecture-diagram-seven-domains-one-local-stack-32m8</link>
      <guid>https://dev.to/tdk-cli/the-erp-architecture-diagram-seven-domains-one-local-stack-32m8</guid>
      <description>&lt;p&gt;An enterprise resource planning system is hard to draw because it is wide. The &lt;a href="https://github.com/tdk-landscape/tdk-erp-system" rel="noopener noreferrer"&gt;tdk-erp-system&lt;/a&gt; example has seven business domains, each with its own backend services and a frontend, plus shared platform pieces. This article draws the whole layout in one Mermaid diagram.&lt;/p&gt;

&lt;p&gt;The dashboard-to-API edges in the diagram come from &lt;code&gt;dependsOn&lt;/code&gt; entries in the repo's &lt;code&gt;service.json&lt;/code&gt; files. In the manifests I read, each of those dependencies sits inside one stack. The arrows from the developer and from the stacks to the platform are my simplification, not declared dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  The diagram
&lt;/h2&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    DEV["Developer runs tdk up with a stack name"]

    subgraph PLAT["platform: shared infrastructure"]
        PDB["database-management: Postgres compose file"]
    end

    subgraph FIN["finance stack: 15 services in the README"]
        FAPI["backend APIs on ports 4010 to 4024"]
        FGL["general-ledger-api"]
        FAR["financial-analytics-api"]
        FDASH["finance-dashboard-app on port 3010"]
    end

    subgraph HR["hr stack: 12 services in the README"]
        HAPI["backend APIs on ports 4100 to 4111"]
        HEP["employee-portal-api"]
        HPORT["hr-portal-app on port 3020"]
    end

    subgraph INV["inventory stack: 18 services in the README"]
        IAPI["backend APIs on ports 4200 and up"]
        IMG["inventory-management-api"]
        IAPP["inventory-management-app"]
    end

    subgraph SALES["sales stack: 20 services in the README"]
        SAPI["backend APIs on ports 4300 and up"]
        SCRM["crm-api"]
        SAPP["sales-crm-app"]
    end

    subgraph MFG["manufacturing stack: 15 services in the README"]
        MAPI["backend APIs"]
        MPP["production-planning-api"]
        MAPP["production-control-app"]
    end

    subgraph SC["supply_chain stack: 12 services in the README"]
        SAPIC["backend APIs"]
        SCP["supply-chain-planning-api"]
        SCAPP["supply-chain-app"]
    end

    subgraph ANA["analytics stack: 8 services in the README"]
        AAPI["backend APIs on ports 4600 to 4607"]
        ABI["business-intelligence-api"]
        ABIAPP["bi-dashboard-app on port 3070"]
    end

    DEV --&amp;gt; FIN
    DEV --&amp;gt; HR
    DEV --&amp;gt; INV
    DEV --&amp;gt; SALES
    DEV --&amp;gt; MFG
    DEV --&amp;gt; SC
    DEV --&amp;gt; ANA

    FIN --&amp;gt; PLAT
    HR --&amp;gt; PLAT
    INV --&amp;gt; PLAT
    SALES --&amp;gt; PLAT
    MFG --&amp;gt; PLAT
    SC --&amp;gt; PLAT
    ANA --&amp;gt; PLAT

    FDASH --&amp;gt;|"dependsOn"| FAR
    HPORT --&amp;gt;|"dependsOn"| HEP
    IAPP --&amp;gt;|"dependsOn"| IMG
    SAPP --&amp;gt;|"dependsOn"| SCRM
    MAPP --&amp;gt;|"dependsOn"| MPP
    SCAPP --&amp;gt;|"dependsOn"| SCP
    ABIAPP --&amp;gt;|"dependsOn"| ABI&lt;/code&gt;&lt;/pre&gt;



&lt;h2&gt;
  
  
  How to read it
&lt;/h2&gt;

&lt;p&gt;The developer enters through one command, and each stack can be started on its own, such as &lt;code&gt;tdk up finance&lt;/code&gt;. The &lt;code&gt;platform&lt;/code&gt; folder holds a Postgres compose file (&lt;code&gt;database-management&lt;/code&gt;). I have not checked how each stack connects to it, so the arrows from the stacks to the platform show a shared-infrastructure idea rather than a verified wiring.&lt;/p&gt;

&lt;p&gt;Each dashboard depends on the API it calls, and the edge shows that dependency. The start order follows from it: the API starts first, then the dashboard. The &lt;code&gt;dependsOn&lt;/code&gt; lists in the repo are the source of truth, so the diagram should be updated when they change.&lt;/p&gt;

&lt;p&gt;The port blocks are visible in the names. Finance backends use 4010 to 4024, and HR starts at 4100. Analytics uses 4600 and up. Frontends sit in the 3000 range, with finance on 3010, HR on 3020, and analytics on 3070. Inventory, sales, manufacturing, and supply chain show their ranges more loosely, because I did not list every port for them in this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the numbers say
&lt;/h2&gt;

&lt;p&gt;The README gives 15, 12, 18, 20, 15, 12, and 8 services for finance, HR, inventory, sales, manufacturing, supply chain, and analytics. The manifest counts I took directly from the folders differ by one for several stacks, because a frontend and its backend may be counted differently. Check the folder before you rely on a single number.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the diagram leaves out
&lt;/h2&gt;

&lt;p&gt;It does not draw every service, every port, or every generated file. It shows the domain layout and the dependencies that the manifests declare. For a single stack, the stack walkthrough articles in the series show the services in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The ERP example is seven domain stacks on one shared platform. Each stack has backends, a dashboard or portal, and dependencies declared in its own manifests. Start one stack at a time, and let the &lt;code&gt;dependsOn&lt;/code&gt; edges decide the order inside it.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>webdev</category>
      <category>programming</category>
      <category>microservices</category>
    </item>
    <item>
      <title>What Really Happens When You Type tdk up: A Sequence Diagram of TDK CLI</title>
      <dc:creator>tdk-cli</dc:creator>
      <pubDate>Sun, 18 Oct 2026 17:41:50 +0000</pubDate>
      <link>https://dev.to/tdk-cli/what-really-happens-when-you-type-tdk-up-a-sequence-diagram-of-tdk-cli-ib4</link>
      <guid>https://dev.to/tdk-cli/what-really-happens-when-you-type-tdk-up-a-sequence-diagram-of-tdk-cli-ib4</guid>
      <description>&lt;p&gt;The first architecture diagram showed the parts of TDK CLI. This one shows time: what happens, in order, after you type &lt;code&gt;tdk up&lt;/code&gt;. Knowing the order tells you where a start can stop, and which message to read when it does.&lt;/p&gt;

&lt;p&gt;The sequence below follows the repo's documented behaviour: the host check, the drift check before Tilt starts, the Starlark generation at Tilt load time, readiness, and the JSON result. Some steps are summarised, so check them against the code and the docs before you rely on one exact message.&lt;/p&gt;

&lt;h2&gt;
  
  
  The sequence
&lt;/h2&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
    autonumber
    actor Dev as Developer
    participant Agent as AI agent over MCP
    participant CLI as tdk CLI (TypeScript)
    participant Host as Host and container runtime
    participant Snap as Snapshots in .tdk-contract
    participant Tilt as Tilt
    participant Disc as Discovery (Starlark)
    participant Eng as Engine generators (Starlark)
    participant Dock as Docker
    participant Svc as Service containers

    Dev-&amp;gt;&amp;gt;CLI: tdk up (or agent calls up)
    Agent-&amp;gt;&amp;gt;CLI: up (MCP tool runs tdk up --json)

    CLI-&amp;gt;&amp;gt;Host: check host type and container runtime
    alt canUp is false
        Host--&amp;gt;&amp;gt;CLI: no Docker, WebContainer, or Windows opt-in missing
        CLI--&amp;gt;&amp;gt;Dev: exit non-zero, tell the reason, do not spawn Tilt
    else canUp is true
        CLI-&amp;gt;&amp;gt;Snap: compare generated files with saved snapshots
        alt a generated file was hand-edited
            Snap--&amp;gt;&amp;gt;CLI: drift found, name the file
            CLI--&amp;gt;&amp;gt;Dev: block the start, fix the source and retry
        else no drift
            CLI-&amp;gt;&amp;gt;Tilt: spawn Tilt with the project Tiltfile
            Tilt-&amp;gt;&amp;gt;Disc: load service.json files
            Disc--&amp;gt;&amp;gt;Tilt: resources, stacks, dependsOn
            Tilt-&amp;gt;&amp;gt;Eng: generate per-service runtime files
            Eng--&amp;gt;&amp;gt;Tilt: write .autogenerated and service.yaml
            Tilt-&amp;gt;&amp;gt;Dock: build images, start containers in order
            Dock-&amp;gt;&amp;gt;Svc: start proxy, Postgres, services
            Svc--&amp;gt;&amp;gt;Tilt: health route answers
            Tilt--&amp;gt;&amp;gt;CLI: resources report ready or failed
            CLI--&amp;gt;&amp;gt;Agent: ok true, or ok false with errors
            CLI--&amp;gt;&amp;gt;Dev: TDK is up, with URLs and ports
        end
    end

    Note over Agent,CLI: The agent polls status until readiness.ready is true
    Agent-&amp;gt;&amp;gt;CLI: status
    CLI--&amp;gt;&amp;gt;Agent: readiness ready, pending, or failures
    Dev-&amp;gt;&amp;gt;CLI: tdk down
    CLI-&amp;gt;&amp;gt;Tilt: stop resources
    Tilt-&amp;gt;&amp;gt;Dock: stop and remove containers&lt;/code&gt;&lt;/pre&gt;



&lt;h2&gt;
  
  
  The steps that can stop you
&lt;/h2&gt;

&lt;p&gt;Four steps can stop a start, and each one tells you something different.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The host check.&lt;/strong&gt; If &lt;code&gt;canUp&lt;/code&gt; is false, the machine is the problem. No change to your project will help until the host has a working container runtime. The command exits without starting Tilt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The drift check.&lt;/strong&gt; A hand edit to a file under &lt;code&gt;.autogenerated/&lt;/code&gt; blocks the start and names the file. The fix is upstream: change &lt;code&gt;service.json&lt;/code&gt; or the generator, then start again. This check runs before Tilt is spawned, so nothing has been built yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Readiness.&lt;/strong&gt; &lt;code&gt;up&lt;/code&gt; returns before the stack is ready, because a build can take longer than one command. The result tells you whether every resource is built, running, and healthy, or which one failed. &lt;code&gt;tdk status --json&lt;/code&gt; answers the same question at any time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first failed resource.&lt;/strong&gt; A failure in one service usually stops the ones that depend on it. Read the logs for the first failed resource, not the last. &lt;code&gt;tdk logs --json --service &amp;lt;name&amp;gt; --tail 200&lt;/code&gt; returns a bounded snapshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the agent fits
&lt;/h2&gt;

&lt;p&gt;An agent does not replace this sequence. It calls the same commands through the MCP server. The useful part for the agent is the loop: call &lt;code&gt;up&lt;/code&gt;, poll &lt;code&gt;status&lt;/code&gt; until ready, read &lt;code&gt;logs&lt;/code&gt; for any failure, then stop. The sequence above shows why the poll is needed. &lt;code&gt;up&lt;/code&gt; returns before readiness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stopping cleanly
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;tdk down&lt;/code&gt; reverses the lifecycle: Tilt stops the resources, and Docker removes the containers. Run it when you finish. A stack left running keeps its ports, and the next &lt;code&gt;up&lt;/code&gt; may refuse to start while an old Tilt still answers on its port.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;One &lt;code&gt;tdk up&lt;/code&gt; is a short chain of checks before any container starts: host, drift, then generation and readiness. Each check has its own message, and each message points at the fix. Read them in order, and most starts become a matter of reading the first line that failed.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Largest Architecture Diagram You Have Never Seen: TDK CLI, End to End</title>
      <dc:creator>tdk-cli</dc:creator>
      <pubDate>Sun, 18 Oct 2026 17:40:38 +0000</pubDate>
      <link>https://dev.to/tdk-cli/the-largest-architecture-diagram-you-have-never-seen-tdk-cli-end-to-end-3mcj</link>
      <guid>https://dev.to/tdk-cli/the-largest-architecture-diagram-you-have-never-seen-tdk-cli-end-to-end-3mcj</guid>
      <description>&lt;p&gt;Most tool documentation shows one box and one arrow. TDK CLI is bigger than that. A single &lt;code&gt;tdk up&lt;/code&gt; passes through TypeScript commands, Starlark discovery and generators, a generated Tiltfile, Docker containers, a Traefik proxy, and a set of checks that run before anything starts.&lt;/p&gt;

&lt;p&gt;This article draws the whole system in one Mermaid diagram, then walks through it. The diagram follows the repository's own maintainer guide (&lt;code&gt;docs/TOPOLOGY.md&lt;/code&gt;) and the folders I read in the source. Some labels are summaries, so check the names against the repo before you rely on a single one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The diagram
&lt;/h2&gt;



&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    %% ---------- People and clients ----------
    DEV["Developer at a terminal"]
    AGENT["AI agent: Codex or Claude Code"]
    IDE["IDE and editor"]

    %% ---------- Inputs you own ----------
    subgraph INPUTS["Inputs you own"]
        PROJ[".tdk/project.json"]
        SVC["service.json per service"]
        SRC["Application source code"]
        TILTF["Project Tiltfile"]
        ENVF["Environment files and secrets"]
    end

    %% ---------- CLI in TypeScript ----------
    subgraph CLI["CLI in TypeScript: cli/src"]
        direction TB
        CMDS["commands: project, resource, up, down, status, logs, ui, doctor, config, mcp"]
        CFG["config and types"]
        GEN["generator: Handlebars project files"]
        FEPROV["frontend-frameworks: react, vue, svelte, solid, preact, lit, qwik, vanilla, tanstack-router"]
        BEPROV["backend-languages: bun, go, python, rust"]
        BFW["backend-frameworks: hono, express, elysia, fastify, nestjs, koa, h3, mcp"]
        MCPSRV["mcp server over stdio: doctor, up, down, status, logs, resource_list"]
        UI["ui: terminal dashboard"]
        UTIL["utils and components"]
    end

    %% ---------- CLI templates ----------
    subgraph TPL["CLI templates: cli/templates"]
        TPLT["Tiltfile.hbs"]
        TPLS["spec.master.hbs"]
        TPLSTACK["TILT_TECH_STACK.star.hbs"]
        TPLDEF["TILT_RESOURCE_DEFAULTS.star.hbs"]
    end

    %% ---------- Discovery in Starlark ----------
    subgraph DISC["Discovery in Starlark: discovery/"]
        DORCH["discovery_orchestrator.star"]
        DREG["registry.star"]
        DMAN["manifest scan and validation"]
        DSNAP["snapshots"]
    end

    %% ---------- Engine in Starlark ----------
    subgraph ENG["Engine in Starlark: engine/topologies"]
        direction TB
        subgraph GENS["tilt/generators"]
            GIDX["index.star"]
            GVITE["Vite and TypeScript configs"]
            GNPM["npm and bunfig config"]
            GPRISMA["Prisma config"]
            GENV["environment files and API helpers"]
            GAGENTS["AGENTS.md notice"]
        end
        subgraph RES["tilt/resources"]
            RDECL["resource declaration"]
            RORCH["orchestrator and generators"]
            RDEP["startup order and dependsOn"]
            RTRIG["triggers and live update"]
        end
        subgraph MAN["tilt/manifest"]
            MLOAD["manifest loader"]
            MSCHEMA["schema and constants"]
        end
        subgraph PLAT["platform"]
            PDOCK["docker: language and frontend Dockerfiles"]
            PNET["networking and Traefik"]
            PINFRA["Postgres and optional infra"]
        end
    end

    %% ---------- Generated runtime files ----------
    subgraph GENOUT["Generated per service: .autogenerated"]
        DFILE["Dockerfile.app.autogenerated"]
        NGINX["nginx.autogenerated.conf"]
        VCONF["vite and tsconfig files"]
        APIC["api-client.ts and env.ts"]
        SNAP[".tdk-contract snapshots"]
        SYAML["service.yaml projection"]
    end

    %% ---------- Checks ----------
    subgraph CHECKS["Checks"]
        DOCTOR["tdk doctor: host and canUp"]
        DRIFT["drift check: generated files vs snapshots"]
        DRYRUN["tdk up --dry-run: plan only"]
        MIGWARN["doctor warning: migration in start script"]
        READY["readiness: status and up JSON"]
    end

    %% ---------- Runtime ----------
    subgraph RUNTIME["Runtime on your machine"]
        TILT["Tilt: builds, watches, live-updates"]
        DOCKER["Docker engine"]
        TRAEFIK["Traefik proxy"]
        PG["PostgreSQL"]
        SVCS["Service containers: frontends, APIs, workers, MCP servers"]
        NATS["NATS messaging when enabled"]
    end

    %% ---------- Outside the local loop ----------
    subgraph PROD["Outside TDK: production"]
        HELM["Helm"]
        ARGO["Argo CD"]
        KUST["Kustomize"]
    end

    %% ---------- Flows ----------
    DEV --&amp;gt; CMDS
    IDE --&amp;gt; SRC
    AGENT --&amp;gt; MCPSRV
    MCPSRV --&amp;gt; CMDS

    CMDS --&amp;gt; GEN
    GEN --&amp;gt; TPL
    CMDS --&amp;gt; FEPROV
    CMDS --&amp;gt; BEPROV
    CMDS --&amp;gt; BFW
    CMDS --&amp;gt; UI
    CMDS --&amp;gt; CFG
    CFG --&amp;gt; UTIL

    PROJ --&amp;gt; DORCH
    SVC --&amp;gt; DORCH
    DORCH --&amp;gt; DREG
    DORCH --&amp;gt; DMAN
    DMAN --&amp;gt; MLOAD
    DREG --&amp;gt; DSNAP

    TILTF --&amp;gt; DORCH
    TILTF --&amp;gt; RDECL
    RDECL --&amp;gt; RORCH
    RORCH --&amp;gt; GIDX
    GIDX --&amp;gt; GVITE
    GIDX --&amp;gt; GNPM
    GIDX --&amp;gt; GPRISMA
    GIDX --&amp;gt; GENV
    GIDX --&amp;gt; GAGENTS
    RORCH --&amp;gt; RDEP
    RDEP --&amp;gt; RTRIG
    MLOAD --&amp;gt; MSCHEMA
    RORCH --&amp;gt; PDOCK
    RORCH --&amp;gt; PNET
    RORCH --&amp;gt; PINFRA

    GENS --&amp;gt; GENOUT
    PDOCK --&amp;gt; DFILE
    PNET --&amp;gt; NGINX
    GVITE --&amp;gt; VCONF
    GENV --&amp;gt; APIC
    GENOUT --&amp;gt; SNAP
    GENOUT --&amp;gt; SYAML

    CMDS --&amp;gt; DOCTOR
    SNAP --&amp;gt; DRIFT
    DRIFT --&amp;gt; TILT
    CMDS --&amp;gt; DRYRUN
    RORCH --&amp;gt; MIGWARN
    TILT --&amp;gt; READY

    SRC --&amp;gt; TILT
    ENVF --&amp;gt; TILT
    TILT --&amp;gt; DOCKER
    DOCKER --&amp;gt; TRAEFIK
    DOCKER --&amp;gt; PG
    DOCKER --&amp;gt; SVCS
    DOCKER --&amp;gt; NATS
    TRAEFIK --&amp;gt; SVCS
    SVCS --&amp;gt; PG
    SVCS --&amp;gt; NATS

    HELM --&amp;gt; ARGO
    KUST --&amp;gt; ARGO

    %% ---------- Styling ----------
    classDef cli fill:#e8f1ff,stroke:#1d4ed8,color:#0f172a
    classDef engine fill:#fff4e5,stroke:#c2410c,color:#0f172a
    classDef runtime fill:#e8fbef,stroke:#15803d,color:#0f172a
    classDef check fill:#fdecec,stroke:#b91c1c,color:#0f172a
    classDef prod fill:#f3f4f6,stroke:#6b7280,color:#0f172a
    class CMDS,CFG,GEN,FEPROV,BEPROV,BFW,MCPSRV,UI,UTIL cli
    class DORCH,DREG,DMAN,DSNAP,GIDX,RDECL,RORCH,RDEP,RTRIG,MLOAD,MSCHEMA,PDOCK,PNET,PINFRA engine
    class TILT,DOCKER,TRAEFIK,PG,SVCS,NATS runtime
    class DOCTOR,DRIFT,DRYRUN,MIGWARN,READY check
    class HELM,ARGO,KUST prod&lt;/code&gt;&lt;/pre&gt;



&lt;h2&gt;
  
  
  How to read it
&lt;/h2&gt;

&lt;p&gt;Start at the top left. A developer, or an agent over MCP, enters the CLI. The CLI has three jobs: scaffolding files through templates and providers, reading the project's commands, and starting the stack.&lt;/p&gt;

&lt;p&gt;The middle of the diagram is the two-stage generation the maintainer guide describes. The CLI writes starter files in TypeScript. At Tilt time, Starlark discovery reads each &lt;code&gt;service.json&lt;/code&gt;, and the engine's generators write the runtime files under &lt;code&gt;.autogenerated/&lt;/code&gt;. Those files are what Docker and Tilt run.&lt;/p&gt;

&lt;p&gt;The right side shows the checks. &lt;code&gt;doctor&lt;/code&gt; answers whether the machine can run the stack. The drift check compares generated files with their snapshots before startup. The dry run prints the plan. The readiness output tells you, or an agent, when a service is ready.&lt;/p&gt;

&lt;p&gt;The bottom shows the runtime: Tilt drives Docker, Docker runs the Traefik proxy, Postgres, the service containers, and NATS when it is enabled. Production sits outside the loop. The diagram ends with Helm, Argo CD, and Kustomize, because TDK does not generate cluster manifests by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things the diagram leaves out
&lt;/h2&gt;

&lt;p&gt;It does not show every module or every generator. The &lt;code&gt;.tdk-contract&lt;/code&gt; snapshots, the optional observability stacks, and the golden image layer are simplified or omitted. Use the repo's topology guide when you need the full list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;TDK CLI is a loop: TypeScript commands write project files, Starlark generators turn &lt;code&gt;service.json&lt;/code&gt; into runtime files, checks confirm the result, and Docker and Tilt run it. Keep the inputs in your hands, treat the generated files as output, and let the checks tell you when something has drifted.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>devops</category>
      <category>books</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Prompts for Claude Code and Codex That Work With TDK CLI: Build the App, Then Run the Stack</title>
      <dc:creator>tdk-cli</dc:creator>
      <pubDate>Sun, 18 Oct 2026 17:37:25 +0000</pubDate>
      <link>https://dev.to/tdk-cli/prompts-for-claude-code-and-codex-that-work-with-tdk-cli-build-the-app-then-run-the-stack-48c7</link>
      <guid>https://dev.to/tdk-cli/prompts-for-claude-code-and-codex-that-work-with-tdk-cli-build-the-app-then-run-the-stack-48c7</guid>
      <description>&lt;p&gt;Claude Code and Codex work inside your project folder, so they can read the code, run commands, and edit files. TDK CLI gives them a local stack they can control. The prompts below ask for an app shaped so TDK can describe and run it, and the steps after them connect the agent to the stack.&lt;/p&gt;

&lt;p&gt;I have not run these prompts in Claude Code or Codex for this article, so check the output. The MCP setup for Codex comes from the TDK agent tooling docs. For Claude Code, follow that guide's own steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you start
&lt;/h2&gt;

&lt;p&gt;Create the project with TDK first, so the agent starts from the same layout TDK expects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tdk project &lt;span class="nt"&gt;--yes&lt;/span&gt;
tdk resource api &lt;span class="nt"&gt;--type&lt;/span&gt; backend &lt;span class="nt"&gt;-y&lt;/span&gt;
tdk resource web &lt;span class="nt"&gt;--type&lt;/span&gt; frontend &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm the machine can run the stack, and read the plan before the first start:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tdk doctor &lt;span class="nt"&gt;--json&lt;/span&gt;
tdk up main &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connect the MCP server, so the agent can use the stack directly. For Codex, add this to &lt;code&gt;.codex/config.toml&lt;/code&gt; in the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mcp_servers.tdk]&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"tdk"&lt;/span&gt;
&lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;cwd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/absolute/path/to/your/tdk-project"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Claude Code, follow the &lt;a href="https://github.com/tdk-landscape/tdk-cli-core/blob/main/docs/agent-tooling/tdk-mcp.md" rel="noopener noreferrer"&gt;agent tooling guide&lt;/a&gt;. The working directory must be the project folder either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt 1: start and check the stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use the TDK tools to check this project.
1. Call doctor. If canUp is false, stop and tell me why.
2. Call up for the api and web services.
3. Call status until readiness.ready is true, or until failures appear.
4. If a service fails, call logs for that service with tail 200 and quote the first error line.
Do not edit any file under .autogenerated/.
Report the status output, not a summary of it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why it works: it gives the agent a procedure with a clear finish line, and it asks for evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt 2: add a service without touching the generated files
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add a worker service called order-emails with TDK.
Run: tdk resource order-emails --type worker -y
Make it depend on the api service by adding it to dependsOn in its service.json.
Do not edit anything under .autogenerated/.
Then run tdk up main --dry-run and confirm the api starts before order-emails.
If the dry run shows an error, stop and report it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why it works: the dependency is declared, the generated files are off limits, and the agent checks the start order against the plan TDK prints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt 3: fix a failing service with a bounded loop
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The api service is failing. Work on it this way:
1. Call logs for api with tail 200. Find the first error line.
2. Fix that error in the source under services/, not in generated files.
3. Call status until api is ready, or stop after three attempts.
4. After three failed attempts, stop and report what you tried and the latest log lines.
Do not change service.json ports or the health path without asking me.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why it works: it limits retries, keeps the fix in the source, and stops before the agent starts changing configuration you have not approved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt 4: check the change before you accept it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Show me the list of files you changed, then the diff for each one.
Run the tests for the service you changed and paste the output.
Call status and confirm the service is ready after your change.
Tell me anything you did not verify.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why it works: it turns "done" into a list you can read, and it asks for the gaps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt 5: stop cleanly
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;We are finished. Call down to stop the stack, then call status and confirm nothing is running.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why it works: a stack left running holds ports for the next start, and the status call confirms the stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rules to put in your project instructions
&lt;/h2&gt;

&lt;p&gt;Add these to &lt;code&gt;AGENTS.md&lt;/code&gt; or your Claude Code instructions, so every session follows them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with &lt;code&gt;doctor&lt;/code&gt;, then &lt;code&gt;up&lt;/code&gt;, then &lt;code&gt;status&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Never edit files under &lt;code&gt;.autogenerated/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Stop after three failed attempts and report.&lt;/li&gt;
&lt;li&gt;Ask before changing ports, health paths, or secrets.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;down&lt;/code&gt; when the task is finished.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common problems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;doctor&lt;/code&gt; says &lt;code&gt;canUp&lt;/code&gt; is false.&lt;/strong&gt; The machine cannot run the stack. The agent should stop there, not retry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;up&lt;/code&gt; returns, but nothing is ready.&lt;/strong&gt; It returns before readiness. The agent must poll &lt;code&gt;status&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The agent edits a generated file.&lt;/strong&gt; The next generation overwrites it. Restate the rule, and check the drift output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two stacks fight over ports.&lt;/strong&gt; Run &lt;code&gt;down&lt;/code&gt; on the old one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Give Claude Code and Codex a project created by TDK, connect the MCP server from the project folder, and use prompts that ask for a procedure, a finish line, a retry limit, and evidence. The agent does the typing. TDK keeps the stack in a shape it can check.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>promptengineering</category>
      <category>vibecoding</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
