<?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: Artem Dudarev</title>
    <description>The latest articles on DEV Community by Artem Dudarev (@dudarev).</description>
    <link>https://dev.to/dudarev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F130465%2F8935211c-e3f3-4139-81c2-85ac93bf83de.jpeg</url>
      <title>DEV Community: Artem Dudarev</title>
      <link>https://dev.to/dudarev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dudarev"/>
    <language>en</language>
    <item>
      <title>SpeechDown CLI: Playground for Software Craft and AI Collaboration</title>
      <dc:creator>Artem Dudarev</dc:creator>
      <pubDate>Thu, 19 Jun 2025 11:43:34 +0000</pubDate>
      <link>https://dev.to/dudarev/speechdown-cli-playground-for-software-craft-and-ai-collaboration-1gl</link>
      <guid>https://dev.to/dudarev/speechdown-cli-playground-for-software-craft-and-ai-collaboration-1gl</guid>
      <description>&lt;p&gt;I've been working on a personal project called &lt;strong&gt;&lt;a href="https://github.com/dudarev/speechdown" rel="noopener noreferrer"&gt;SpeechDown&lt;/a&gt;&lt;/strong&gt;, a CLI tool that turns my voice notes into timestamped, multilingual Markdown files I can actually search and revisit. The aim isn’t to launch the next blockbuster transcription service—it’s to give myself a dependable way to capture ideas on the go in a structured format. For the last couple of years I’ve relied on its predecessor, &lt;a href="https://github.com/dudarev/voice-cli" rel="noopener noreferrer"&gt;voice-cli&lt;/a&gt;, which proved how powerful that workflow can be. SpeechDown is the natural successor and, yes, a playground for practicing software-craft principles and experimenting with AI-driven development.&lt;/p&gt;

&lt;p&gt;This post is a brief tour of that journey so far.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Quick Disclaimer
&lt;/h2&gt;

&lt;p&gt;First things first: I don't recommend using SpeechDown for any critical work &lt;em&gt;just yet&lt;/em&gt;. It's a work in progress. However, I believe the code and the development practices behind it can serve as a useful, real-world example for the concepts I'm about to discuss.&lt;/p&gt;

&lt;p&gt;You can find the full source code on GitHub: &lt;a href="https://github.com/dudarev/speechdown" rel="noopener noreferrer"&gt;dudarev/speechdown&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TLDR Overview
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capture and organise my own voice notes in a searchable Markdown corpus
&lt;/li&gt;
&lt;li&gt;Personal sandbox to practise software-craft principles
&lt;/li&gt;
&lt;li&gt;Test-bed for AI-assisted coding workflows
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Architecture in a nutshell&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domain-Driven Design (DDD) keeps core logic pure and language-aligned
&lt;/li&gt;
&lt;li&gt;Ports &amp;amp; Adapters (Hexagonal) pattern isolates I/O, letting adapters swap freely
&lt;/li&gt;
&lt;li&gt;Four layers: &lt;code&gt;domain&lt;/code&gt;, &lt;code&gt;application&lt;/code&gt;, &lt;code&gt;infrastructure&lt;/code&gt;, &lt;code&gt;presentation&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Process discipline&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture Decision Records (ADRs) capture the “why” of each big choice
&lt;/li&gt;
&lt;li&gt;Design / PRD docs outline features up front for both humans &lt;em&gt;and&lt;/em&gt; AIs
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;AI collaboration model&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design docs serve as rich prompts for Copilot, Codex, Claude Code, etc.
&lt;/li&gt;
&lt;li&gt;A single &lt;code&gt;AI-rules.md&lt;/code&gt; file synchronizes naming, layout, and testing rules across tools
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Current capabilities&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sd transcribe --within-hours 24&lt;/code&gt; turns recent audio into timestamped Markdown
&lt;/li&gt;
&lt;li&gt;Adding a new speech-to-text engine is as simple as implementing another adapter
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pre-v1 playground: solid for learning and tinkering, not yet production-grade&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Further reading&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See the &lt;em&gt;Relevant Links&lt;/em&gt; section at the end for a curated set of recent deep-dive posts and tools that extend these ideas.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Part 1: A Playground for Software Craftsmanship
&lt;/h2&gt;

&lt;p&gt;One of my main goals with SpeechDown was to apply and practice established software design patterns in a Python context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Domain-Driven Design (DDD) &amp;amp; Ports and Adapters Pattern
&lt;/h3&gt;

&lt;p&gt;I structured the project using a layered architecture inspired by DDD and the Ports and Adapters (or Hexagonal) pattern. This helps keep the core logic of the application separate from the tools and technologies it uses.&lt;/p&gt;

&lt;p&gt;The project is split into four distinct layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;domain&lt;/code&gt;: Contains the core business logic, entities, and value objects. It has zero external dependencies.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;application&lt;/code&gt;: Orchestrates the use cases. It defines interfaces (Ports) for external interactions.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;infrastructure&lt;/code&gt;: Provides concrete implementations (Adapters) for the ports. This is where database connections, file system access, and API calls live.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;presentation&lt;/code&gt;: The user-facing layer, in this case, the Command-Line Interface (CLI).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This structure is reflected in the source code directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/speechdown/
├── application/
│   ├── ports/
│   └── services/
├── domain/
│   ├── entities.py
│   └── value_objects.py
├── infrastructure/
│   ├── adapters/
│   └── database.py
└── presentation/
    └── cli/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;strong&gt;Port&lt;/strong&gt; is just an interface. For example, to get a timestamp from a file, the application layer defines a simple contract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# src/speechdown/application/ports/timestamp_port.py
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Protocol&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TimestampPort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Protocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return timestamp extracted from filename or fallback to file mtime.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;Adapter&lt;/strong&gt; is the concrete implementation. This one parses filenames or falls back to the file's modification time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# src/speechdown/infrastructure/adapters/file_timestamp_adapter.py
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="c1"&gt;# ...
&lt;/span&gt;
&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FileTimestampAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TimestampPort&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Adapter for extracting timestamps from filenames with fallbacks.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Try to extract from filename
&lt;/span&gt;        &lt;span class="n"&gt;extracted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_extract_from_filename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;extracted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;extracted&lt;/span&gt;
        &lt;span class="c1"&gt;# Fallback to file modification time
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_get_file_fallback_time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# ... implementation details ...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separation makes the system incredibly flexible and testable. I can easily swap out the &lt;code&gt;FileTimestampAdapter&lt;/code&gt; for one that reads metadata from the audio file without changing any of the application's core logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documenting Decisions with ADRs and Design Docs
&lt;/h3&gt;

&lt;p&gt;To keep track of &lt;em&gt;why&lt;/em&gt; certain decisions were made, I use &lt;strong&gt;Architecture Decision Records (ADRs)&lt;/strong&gt;. They are simple Markdown files that document a decision, its context, and its consequences. You can see them in &lt;code&gt;docs/adrs/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For more detailed feature planning, I use &lt;strong&gt;Design Documents&lt;/strong&gt;, which outline the &lt;em&gt;how&lt;/em&gt;—covering product requirements, UX, and technical design. This practice is especially useful when working with AI assistants.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 2: A Playground for AI Collaboration
&lt;/h2&gt;

&lt;p&gt;The second major goal of SpeechDown is to explore how to work effectively with modern AI coding assistants. Simply asking an AI to "add a feature" often results in code that breaks the established architecture.&lt;/p&gt;

&lt;p&gt;My solution involves two key practices:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Design Documents (PRDs) as AI Prompts
&lt;/h3&gt;

&lt;p&gt;I write detailed design documents before starting a feature. These documents serve as a comprehensive prompt for the AI, giving it the necessary context to generate code that fits the project's structure. I'm considering renaming my &lt;code&gt;design&lt;/code&gt; folder to &lt;code&gt;prds&lt;/code&gt; (Product Requirement Documents), as this seems to be emerging as a standard term for this practice.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Explicit Rules for AI Assistants
&lt;/h3&gt;

&lt;p&gt;I maintain a master rule file, &lt;code&gt;docs/ai/AI-rules.md&lt;/code&gt;, that explicitly defines the project's architecture, naming conventions, and testing requirements.&lt;/p&gt;

&lt;p&gt;Here's a snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Master AI Rules for SpeechDown&lt;/span&gt;

&lt;span class="gu"&gt;## Common Guidelines for All AI Assistants&lt;/span&gt;

&lt;span class="gu"&gt;### Architecture (ADR 008)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Follow Domain-Driven Design with four layers: &lt;span class="gs"&gt;**domain**&lt;/span&gt;, &lt;span class="gs"&gt;**application**&lt;/span&gt;, &lt;span class="gs"&gt;**infrastructure**&lt;/span&gt;, &lt;span class="gs"&gt;**presentation**&lt;/span&gt;.
&lt;span class="p"&gt;-&lt;/span&gt; Domain layer (&lt;span class="sb"&gt;`src/speechdown/domain/`&lt;/span&gt;) contains entities and value objects only. No external dependencies.
&lt;span class="p"&gt;-&lt;/span&gt; Application layer (&lt;span class="sb"&gt;`src/speechdown/application/`&lt;/span&gt;) defines ports (interfaces) under &lt;span class="sb"&gt;`application/ports/`&lt;/span&gt;...
&lt;span class="p"&gt;-&lt;/span&gt; Dependencies point inward...

&lt;span class="gu"&gt;### Naming Conventions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Interfaces end with &lt;span class="sb"&gt;`Port`&lt;/span&gt; (e.g., &lt;span class="sb"&gt;`TranscriptionPort`&lt;/span&gt;).
&lt;span class="p"&gt;-&lt;/span&gt; Implementations end with &lt;span class="sb"&gt;`Adapter`&lt;/span&gt; (e.g., &lt;span class="sb"&gt;`WhisperTranscriberAdapter`&lt;/span&gt;).
&lt;span class="p"&gt;-&lt;/span&gt; Service classes end with &lt;span class="sb"&gt;`Service`&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple Python script (&lt;code&gt;scripts/generate_ai_rules.py&lt;/code&gt;) then generates specific configuration files for different AI assistants from this master file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; for GitHub Copilot&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;AGENTS.md&lt;/code&gt; for OpenAI Codex&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;CLAUDE.md&lt;/code&gt; for Anthropic's Claude&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures that no matter which tool I'm using—GitHub Copilot, Google's Jules, or Claude Code—it has the same set of instructions. This has dramatically improved the quality and compliance of AI-generated code.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Quick Look at the Tool
&lt;/h2&gt;

&lt;p&gt;Despite being a playground, SpeechDown is a usable CLI tool. After initializing a project with &lt;code&gt;sd init&lt;/code&gt;, you can run a transcription with a simple command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Transcribe all audio files modified in the last 24 hours&lt;/span&gt;
sd transcribe &lt;span class="nt"&gt;--within-hours&lt;/span&gt; 24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This processes the audio files and groups the transcriptions into daily Markdown files, like &lt;code&gt;2025-06-13.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## 2025-06-13 14:30:22 - recording_idea.m4a&lt;/span&gt;

This is the transcribed text from my first audio note. I should remember to talk about the AI rules.
&lt;span class="p"&gt;
---
&lt;/span&gt;
&lt;span class="gu"&gt;## 2025-06-13 16:45:10 - project_update.m4a&lt;/span&gt;

Another transcription from a different file, automatically appended and sorted chronologically.
&lt;span class="p"&gt;
---
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Relevant Links
&lt;/h2&gt;

&lt;p&gt;This section gathers the core references mentioned above plus a hand-picked set of very recent articles for anyone who wants to dig deeper into the architecture patterns, ADR discipline, AI-assisted coding.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://speechdown.com/" rel="noopener noreferrer"&gt;SpeechDown format&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dudarev/speechdown" rel="noopener noreferrer"&gt;SpeechDown GitHub repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Patterns &amp;amp; Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Domain-driven_design" rel="noopener noreferrer"&gt;Domain-Driven Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alistair.cockburn.us/hexagonal-architecture/" rel="noopener noreferrer"&gt;Hexagonal Architecture / Ports &amp;amp; Adapters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://adr.github.io/" rel="noopener noreferrer"&gt;Architecture Decision Records&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/joelparkerhenderson/architecture-decision-record" rel="noopener noreferrer"&gt;Sample ADR collection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/agile/product-management/requirements" rel="noopener noreferrer"&gt;Product Requirements Documents (PRDs)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Recent Deep Dives
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/architecture/master-architecture-decision-records-adrs-best-practices-for-effective-decision-making/" rel="noopener noreferrer"&gt;Master Architecture Decision Records (ADRs): Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.aalpha.net/blog/hexagonal-architecture/" rel="noopener noreferrer"&gt;Hexagonal Architecture: Principles and Benefits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hieutran25/building-maintainable-python-applications-with-hexagonal-architecture-and-domain-driven-design-chp"&gt;Building Maintainable Python Applications with Hexagonal Architecture and Domain-Driven Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/@akdevblog/hexagonal-architecture-understanding-ports-4020009e1aad" rel="noopener noreferrer"&gt;Hexagonal Architecture: Understanding Ports&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://wasp.sh/blog/2023/08/23/using-product-requirement-documents-generate-better-web-apps-with-ai" rel="noopener noreferrer"&gt;Using Product Requirement Documents to Generate Better Web Apps with AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/html/2406.10101v1" rel="noopener noreferrer"&gt;Requirements are All You Need: From Requirements to Code with LLMs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This project has been an incredible learning experience. It's a practical exercise in applying software architecture principles and a fascinating exploration of human-AI collaboration in coding.&lt;/p&gt;

&lt;p&gt;I'm sharing this not as a finished product, but as a collection of ideas and examples. I'd love to hear your thoughts on this approach.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  What are your strategies for maintaining clean architecture in your projects?&lt;/li&gt;
&lt;li&gt;  How do you guide AI assistants to produce code that fits your standards?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to browse the &lt;a href="https://github.com/dudarev/speechdown" rel="noopener noreferrer"&gt;source code on GitHub&lt;/a&gt;, open an issue, or leave a comment below!&lt;/p&gt;

</description>
      <category>python</category>
      <category>speechtotext</category>
      <category>ddd</category>
      <category>aicoding</category>
    </item>
  </channel>
</rss>
