<?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: Denner Fernandes</title>
    <description>The latest articles on DEV Community by Denner Fernandes (@devdenner).</description>
    <link>https://dev.to/devdenner</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%2F4024304%2F983bd98d-821b-4f8f-b811-157aefb903da.jpg</url>
      <title>DEV Community: Denner Fernandes</title>
      <link>https://dev.to/devdenner</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devdenner"/>
    <language>en</language>
    <item>
      <title>Beyond CRUD: building personal projects to validate architecture, cloud, and automation</title>
      <dc:creator>Denner Fernandes</dc:creator>
      <pubDate>Fri, 10 Jul 2026 17:05:38 +0000</pubDate>
      <link>https://dev.to/devdenner/beyond-crud-building-personal-projects-to-validate-architecture-cloud-and-automation-2p0g</link>
      <guid>https://dev.to/devdenner/beyond-crud-building-personal-projects-to-validate-architecture-cloud-and-automation-2p0g</guid>
      <description>&lt;p&gt;For a long time, whenever someone mentioned a "portfolio project" in the tech world, the standard path was almost always the same: building a system featuring user registration, login, and the ability to list, edit, and delete records.&lt;/p&gt;

&lt;p&gt;In other words: a CRUD application.&lt;/p&gt;

&lt;p&gt;And there is nothing wrong with that.&lt;/p&gt;

&lt;p&gt;CRUDs are important. They help demonstrate fundamentals, code organization, database integration, validation, authentication, UI, and basic application flow.&lt;/p&gt;

&lt;p&gt;However, after years of working on development, integrations, business logic, infrastructure, automation, and production systems, I began to notice a limitation with this type of project: it doesn't always reveal how a person thinks in terms of architecture.&lt;/p&gt;

&lt;p&gt;It shows that you know how to implement screens and endpoints.&lt;/p&gt;

&lt;p&gt;But it doesn't always show that you know how to handle technical decisions that mirror real-world scenarios.&lt;/p&gt;

&lt;p&gt;That is why I decided to revamp my public portfolio with a different approach: building personal projects that are small enough to maintain, yet rich enough to showcase architecture, cloud, automation, testing, domain modeling, and the practical application of AI.&lt;/p&gt;

&lt;p&gt;The goal isn't to build "massive systems."&lt;br&gt;
The goal is to create technical sandboxes that address real-world problems.&lt;/p&gt;


&lt;h2&gt;
  
  
  The problem with generic projects
&lt;/h2&gt;

&lt;p&gt;Many portfolio projects end up stuck in a very similar structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user registration;&lt;/li&gt;
&lt;li&gt;login;&lt;/li&gt;
&lt;li&gt;a list view;&lt;/li&gt;
&lt;li&gt;a creation form;&lt;/li&gt;
&lt;li&gt;an edit button;&lt;/li&gt;
&lt;li&gt;a delete button;&lt;/li&gt;
&lt;li&gt;a simple dashboard;&lt;/li&gt;
&lt;li&gt;basic deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This might be enough to demonstrate foundational knowledge, but for those aiming to show seniority, a crucial layer may be missing: &lt;strong&gt;technical decision-making&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In practice, real-world systems often require addressing more complex questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How is the domain modeled?&lt;/li&gt;
&lt;li&gt;How does the data evolve over time?&lt;/li&gt;
&lt;li&gt;How does the system react to events?&lt;/li&gt;
&lt;li&gt;How are failures handled?&lt;/li&gt;
&lt;li&gt;How is auditing implemented?&lt;/li&gt;
&lt;li&gt;How is infrastructure provisioned?&lt;/li&gt;
&lt;li&gt;How are validations automated?&lt;/li&gt;
&lt;li&gt;How are business rules decoupled from framework details? - How do you integrate external services without excessive coupling?&lt;/li&gt;
&lt;li&gt;How do you test critical behaviors?&lt;/li&gt;
&lt;li&gt;How do you document architectural decisions?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions are harder to demonstrate in a generic CRUD application.&lt;/p&gt;

&lt;p&gt;That is why I started thinking about portfolio projects less as "apps to show off a UI" and more as &lt;strong&gt;software engineering laboratories&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I want to demonstrate
&lt;/h2&gt;

&lt;p&gt;My goal with these projects is to validate certain skills I consider important for backend, full-stack, cloud, and automation development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;domain modeling;&lt;/li&gt;
&lt;li&gt;event-driven architecture;&lt;/li&gt;
&lt;li&gt;TypeScript applied to business logic;&lt;/li&gt;
&lt;li&gt;infrastructure as code;&lt;/li&gt;
&lt;li&gt;use of cloud services;&lt;/li&gt;
&lt;li&gt;CI/CD;&lt;/li&gt;
&lt;li&gt;automated testing;&lt;/li&gt;
&lt;li&gt;observability and auditing;&lt;/li&gt;
&lt;li&gt;decoupled AI integration;&lt;/li&gt;
&lt;li&gt;technical decision documentation;&lt;/li&gt;
&lt;li&gt;product building with controlled scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is for each public project to answer a clear technical question.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do you model an asynchronous financial workflow using events?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do you integrate AI into a product without locking business logic into loose prompts?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or even:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do you organize campaigns, content, metrics, and learning within a growth system?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These questions make the project more interesting than simply displaying a list of database records.&lt;/p&gt;


&lt;h2&gt;
  
  
  Personal projects don't have to be tiny
&lt;/h2&gt;

&lt;p&gt;There is a common portfolio pitfall: thinking that a personal project needs to be extremely simple so it can be finished quickly.&lt;/p&gt;

&lt;p&gt;I agree that the scope needs to be controlled. But "controlled" doesn't mean "superficial."&lt;/p&gt;

&lt;p&gt;A small project can still feature sound architectural decisions.&lt;/p&gt;

&lt;p&gt;It can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a well-defined domain;&lt;/li&gt;
&lt;li&gt;typed events;&lt;/li&gt;
&lt;li&gt;business logic tests;&lt;/li&gt;
&lt;li&gt;clear documentation;&lt;/li&gt;
&lt;li&gt;an architecture diagram;&lt;/li&gt;
&lt;li&gt;a CI pipeline;&lt;/li&gt;
&lt;li&gt;Terraform;&lt;/li&gt;
&lt;li&gt;separation of application and infrastructure;&lt;/li&gt;
&lt;li&gt;structured logs;&lt;/li&gt;
&lt;li&gt;decisions recorded in ADRs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this requires a massive system. The secret is to choose a small scope but treat it seriously.&lt;/p&gt;


&lt;h2&gt;
  
  
  Lab 1: Event-driven architecture with AWS
&lt;/h2&gt;

&lt;p&gt;One of the projects I plan to build is a technical lab for credit portability using event-driven architecture.&lt;/p&gt;

&lt;p&gt;The goal is to create an educational simulation of a financial workflow featuring multiple stages, state transitions, asynchronous events, and an audit trail.&lt;/p&gt;

&lt;p&gt;The planned stack includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TypeScript
AWS EventBridge
AWS Lambda
Amazon SQS
DynamoDB
Terraform
GitHub Actions
Vitest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The objective is not to implement an official specification or replicate a real-world regulatory system. The idea is to use a financial domain as a foundation to explore key technical concepts.&lt;/p&gt;

&lt;p&gt;A simplified workflow might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer requests portability
        ↓
API logs the request
        ↓
Event: portability.request.created
        ↓
EventBridge routes the event
        ↓
Workers process asynchronous steps
        ↓
Request status is updated
        ↓
Audit events are logged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some possible events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;portability.request.created
consent.authorized
source.institution.notified
credit.contract.loaded
proposal.created
proposal.accepted
portability.completed
portability.rejected
portability.failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This type of project allows for demonstrating several relevant points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;event design;&lt;/li&gt;
&lt;li&gt;separation of commands and events;&lt;/li&gt;
&lt;li&gt;asynchronous processing;&lt;/li&gt;
&lt;li&gt;routing with EventBridge;&lt;/li&gt;
&lt;li&gt;queues with SQS;&lt;/li&gt;
&lt;li&gt;Lambda functions;&lt;/li&gt;
&lt;li&gt;persistence in DynamoDB;&lt;/li&gt;
&lt;li&gt;provisioning with Terraform;&lt;/li&gt;
&lt;li&gt;auditing;&lt;/li&gt;
&lt;li&gt;idempotency;&lt;/li&gt;
&lt;li&gt;error handling;&lt;/li&gt;
&lt;li&gt;infrastructure automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is technically much more interesting than simply registering proposals in a database table.&lt;/p&gt;




&lt;h2&gt;
  
  
  Terraform as part of the project, not just a detail
&lt;/h2&gt;

&lt;p&gt;Another important point is treating infrastructure as part of the code.&lt;/p&gt;

&lt;p&gt;Instead of just creating resources manually in the AWS console, the idea is to provision everything using Terraform.&lt;/p&gt;

&lt;p&gt;This makes the architecture more explicit and reproducible.&lt;/p&gt;

&lt;p&gt;A project like this could have a structure such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;credit-portability-event-lab/
  apps/
    api/
    workers/
  packages/
    domain/
    events/
  infra/
    terraform/
      main.tf
      variables.tf
      outputs.tf
      modules/
        eventbridge/
        lambda/
        sqs/
        dynamodb/
        iam/
  docs/
    architecture.md
    event-catalog.md
    decisions/
  .github/
    workflows/
      ci.yml
      terraform-plan.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Infrastructure ceases to be something "outside the project" and becomes part of the technical deliverable.&lt;/p&gt;

&lt;p&gt;This also helps anyone evaluating the repository understand not only the application code but also the environment in which it runs. ---&lt;/p&gt;

&lt;h2&gt;
  
  
  Lab 2: Applied AI decoupled from prompts
&lt;/h2&gt;

&lt;p&gt;Another topic I want to explore is AI applied to products.&lt;/p&gt;

&lt;p&gt;Nowadays, it is relatively simple to add a call to an AI model within an application. However, integrating AI responsibly requires more than just crafting a prompt and waiting for a response.&lt;/p&gt;

&lt;p&gt;Some important questions quickly arise:&lt;/p&gt;

&lt;p&gt;How do you switch AI providers without rewriting the product?&lt;br&gt;
How do you validate inputs and outputs?&lt;br&gt;
How do you audit the context being used?&lt;br&gt;
How do you prevent business logic from being hidden inside prompts?&lt;br&gt;
How do you handle fallbacks?&lt;br&gt;
How do you test workflows without relying on actual API calls?&lt;br&gt;
How do you separate user intent from technical execution?&lt;/p&gt;

&lt;p&gt;One possible approach is to treat AI as an architectural capability.&lt;/p&gt;

&lt;p&gt;Instead of the product thinking directly in terms of a prompt like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Generate a script for a campaign video"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it could work with a structured intent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;intent: generate_content_brief
context:
  campaign: ...
  audience: ...
  objective: ...
constraints:
  platform: instagram_reels
  format: short_video
  tone: ...
output:
  type: structured_brief 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this approach, the application isn't tied to free-form text or a specific vendor. Instead, it operates based on contracts.&lt;/p&gt;

&lt;p&gt;This type of approach enables the creation of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adapters for different providers;&lt;/li&gt;
&lt;li&gt;mock providers for testing;&lt;/li&gt;
&lt;li&gt;model fallbacks;&lt;/li&gt;
&lt;li&gt;response normalization;&lt;/li&gt;
&lt;li&gt;structured logs;&lt;/li&gt;
&lt;li&gt;cost and latency metrics;&lt;/li&gt;
&lt;li&gt;schema-based validation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is one of the key points I want to highlight in my projects: AI not as magic, but as software engineering.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lab 3: Product and growth
&lt;/h2&gt;

&lt;p&gt;Beyond cloud and AI, I also want to build a product-focused project: a system to organize campaigns, content, briefs, metrics, and learnings.&lt;/p&gt;

&lt;p&gt;The idea is to start with a common pain point: many people produce content, test campaigns, and use various tools, yet the history of these activities remains fragmented. The system would feature concepts such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Campaign
ContentPlan
ContentObjective
Content
AiBrief
KnowledgeItem
StorySequence
Metric
Learning
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal would be to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which campaigns are currently underway?&lt;/li&gt;
&lt;li&gt;which pieces of content need to be produced?&lt;/li&gt;
&lt;li&gt;which pieces of content are overdue?&lt;/li&gt;
&lt;li&gt;which objective does each piece of content serve?&lt;/li&gt;
&lt;li&gt;which ideas still need to be turned into scripts?&lt;/li&gt;
&lt;li&gt;which pieces of content have been published?&lt;/li&gt;
&lt;li&gt;what have we learned from the results?&lt;/li&gt;
&lt;li&gt;what type of content is worth repeating?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This project would focus less on heavy cloud infrastructure and more on domain modeling, product design, UX, TypeScript, Next.js, Prisma, and applied AI.&lt;/p&gt;

&lt;p&gt;The tech stack could be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Next.js
React
TypeScript
Prisma
PostgreSQL
Tailwind
shadcn/ui
Vitest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It would serve as a laboratory to demonstrate the construction of a complete product without relying on complex infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  What sets these projects apart
&lt;/h2&gt;

&lt;p&gt;The main difference between these projects and a traditional CRUD application lies not just in the technologies used.&lt;/p&gt;

&lt;p&gt;It lies in the intent.&lt;/p&gt;

&lt;p&gt;A CRUD application typically demonstrates implementation.&lt;/p&gt;

&lt;p&gt;These projects aim to demonstrate decisions.&lt;/p&gt;

&lt;p&gt;Decisions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;why use events?&lt;/li&gt;
&lt;li&gt;where should state be persisted?&lt;/li&gt;
&lt;li&gt;how should contracts be versioned?&lt;/li&gt;
&lt;li&gt;what should it be synchronous or asynchronous?&lt;/li&gt;
&lt;li&gt;what failures need to be anticipated?&lt;/li&gt;
&lt;li&gt;how do you audit a decision?&lt;/li&gt;
&lt;li&gt;how do you separate domain logic from infrastructure?&lt;/li&gt;
&lt;li&gt;how do you test business rules?&lt;/li&gt;
&lt;li&gt;how do you avoid vendor lock-in?&lt;/li&gt;
&lt;li&gt;how do you keep the scope small without sacrificing technical value?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These decisions are closer to actual engineering work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Documentation is also part of the portfolio
&lt;/h2&gt;

&lt;p&gt;One point I want to take more seriously is documentation.&lt;/p&gt;

&lt;p&gt;There is no point in publishing a repository with interesting code if no one can quickly understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what problem it solves;&lt;/li&gt;
&lt;li&gt;how to run it locally;&lt;/li&gt;
&lt;li&gt;which architecture was chosen;&lt;/li&gt;
&lt;li&gt;what decisions were made;&lt;/li&gt;
&lt;li&gt;what trade-offs exist;&lt;/li&gt;
&lt;li&gt;what the next steps are.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Therefore, each project should have, at a minimum:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;README.md
docs/architecture.md
docs/event-catalog.md
docs/decisions/
docs/roadmap.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also intend to use ADRs to record important architectural decisions.&lt;/p&gt;

&lt;p&gt;A simple ADR can answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;what the context was;&lt;/li&gt;
&lt;li&gt;what decision was made;&lt;/li&gt;
&lt;li&gt;what alternatives were considered;&lt;/li&gt;
&lt;li&gt;what consequences the decision entails.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This helps demonstrate technical reasoning, not just the final code.&lt;/p&gt;




&lt;h2&gt;
  
  
  CI/CD and quality
&lt;/h2&gt;

&lt;p&gt;Another important point is automation.&lt;/p&gt;

&lt;p&gt;Even for a personal project, I want to include basic validation pipelines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lint
typecheck
test
build
terraform fmt
terraform validate
terraform plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This shows a commitment to quality and reproducibility.&lt;/p&gt;

&lt;p&gt;A simple CI workflow using GitHub Actions is enough to demonstrate technical maturity.&lt;/p&gt;

&lt;p&gt;The idea isn't to create bureaucracy, but to make it clear that the project was designed as software capable of evolving.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I hope to learn
&lt;/h2&gt;

&lt;p&gt;These projects are also a form of study.&lt;/p&gt;

&lt;p&gt;I want to delve deeper into specific topics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EventBridge in integration scenarios;&lt;/li&gt;
&lt;li&gt;event catalog design;&lt;/li&gt;
&lt;li&gt;modular Terraform; - serverless architecture;&lt;/li&gt;
&lt;li&gt;domain tests in TypeScript;&lt;/li&gt;
&lt;li&gt;secure AI integration;&lt;/li&gt;
&lt;li&gt;product modeling;&lt;/li&gt;
&lt;li&gt;separation of application, domain, and infrastructure;&lt;/li&gt;
&lt;li&gt;minimal observability;&lt;/li&gt;
&lt;li&gt;technical documentation for public projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to pretend a personal project replaces a real production environment.&lt;/p&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;But a good personal project can show how a person thinks, organizes problems, and makes decisions.&lt;/p&gt;

&lt;p&gt;And that holds great value.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I plan to publish
&lt;/h2&gt;

&lt;p&gt;The idea is to keep the projects public on GitHub, with documentation and incremental evolution.&lt;/p&gt;

&lt;p&gt;I also intend to share lessons learned through articles and technical posts, showcasing the build process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;domain selection;&lt;/li&gt;
&lt;li&gt;architecture design;&lt;/li&gt;
&lt;li&gt;event definition;&lt;/li&gt;
&lt;li&gt;infrastructure setup;&lt;/li&gt;
&lt;li&gt;testing;&lt;/li&gt;
&lt;li&gt;errors encountered;&lt;/li&gt;
&lt;li&gt;scope adjustments;&lt;/li&gt;
&lt;li&gt;decisions that changed along the way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More than just posting the final result, I want to show the construction process.&lt;/p&gt;

&lt;p&gt;Because, in practice, software engineering is far more about process and decision-making than it is about a finished UI screen.&lt;/p&gt;




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

&lt;p&gt;Personal projects can be more than just CRUD exercises.&lt;/p&gt;

&lt;p&gt;They can serve as laboratories for validating architecture, cloud, automation, product, and applied AI.&lt;/p&gt;

&lt;p&gt;They don't need to be massive.&lt;br&gt;
They don't need to try to solve the world's problems.&lt;br&gt;
But they do need a clear technical intent.&lt;/p&gt;

&lt;p&gt;In my case, I want to use these projects to demonstrate how I approach systems: starting with the domain, then moving through architecture, infrastructure, testing, automation, and documentation.&lt;/p&gt;

&lt;p&gt;Ultimately, what I want to show isn't just that I know how to write code.&lt;/p&gt;

&lt;p&gt;I want to show that I know how to build software with context, decision-making, and purpose.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>career</category>
      <category>cloud</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Building a growth system driven by campaigns, content, and applied intelligence.</title>
      <dc:creator>Denner Fernandes</dc:creator>
      <pubDate>Fri, 10 Jul 2026 16:37:10 +0000</pubDate>
      <link>https://dev.to/devdenner/building-a-growth-system-driven-by-campaigns-content-and-applied-intelligence-4hao</link>
      <guid>https://dev.to/devdenner/building-a-growth-system-driven-by-campaigns-content-and-applied-intelligence-4hao</guid>
      <description>&lt;p&gt;Lately, I’ve been thinking a lot about a recurring pain point in digital projects: many individuals and small businesses produce content, run campaigns, test ideas, and use AI tools, yet everything almost always ends up scattered.&lt;/p&gt;

&lt;p&gt;Some of it is in spreadsheets.&lt;br&gt;
Some is in task management tools.&lt;br&gt;
Some is in WhatsApp conversations.&lt;br&gt;
Some is in loose documents.&lt;br&gt;
And when the time comes to understand what actually worked, the history is already too fragmented.&lt;/p&gt;

&lt;p&gt;Based on this observation, I began structuring a personal project that I currently call a "growth operating system."&lt;/p&gt;

&lt;p&gt;The idea isn't simply to create yet another editorial calendar tool. The technical goal is to model a complete workflow that connects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;campaigns;&lt;/li&gt;
&lt;li&gt;objectives;&lt;/li&gt;
&lt;li&gt;content planning;&lt;/li&gt;
&lt;li&gt;brief generation;&lt;/li&gt;
&lt;li&gt;institutional memory and knowledge;&lt;/li&gt;
&lt;li&gt;metrics;&lt;/li&gt;
&lt;li&gt;continuous learning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is still a work in progress, but it has already served as a great laboratory for decisions regarding architecture, domain modeling, and the responsible use of AI in a product.&lt;/p&gt;
&lt;h2&gt;
  
  
  The general idea behind the system
&lt;/h2&gt;

&lt;p&gt;At a high level, the way it works is simple.&lt;/p&gt;

&lt;p&gt;The user defines a campaign, specifies an objective, and organizes content around that strategy. Each piece of content can have a format, a platform, a status, and a scheduled date.&lt;/p&gt;

&lt;p&gt;From there, the system helps answer questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what needs to be produced this week?&lt;/li&gt;
&lt;li&gt;which content items are overdue?&lt;/li&gt;
&lt;li&gt;which campaigns are currently underway?&lt;/li&gt;
&lt;li&gt;which objectives does each piece of content address?&lt;/li&gt;
&lt;li&gt;which ideas still need to be turned into scripts?&lt;/li&gt;
&lt;li&gt;which content has already been published?&lt;/li&gt;
&lt;li&gt;what insights emerged from the results?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The proposal is to transform a process that is typically scattered into a more traceable workflow.&lt;/p&gt;

&lt;p&gt;Instead of treating each post, video, or script as an isolated item, the system views everything within a context: campaign, phase, objective, platform, format, and result.&lt;/p&gt;
&lt;h2&gt;
  
  
  Domain modeling before the interface
&lt;/h2&gt;

&lt;p&gt;An important decision was to start with domain modeling, rather than the user interface. In projects like this, it’s tempting to start by designing beautiful dashboards, calendars, and cards. However, without a well-defined domain, the interface ends up being merely a visual layer atop fragile data.&lt;/p&gt;

&lt;p&gt;That is why the project’s foundation is being organized around entities such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Campaign&lt;/span&gt;
&lt;span class="nx"&gt;ContentPlan&lt;/span&gt;
&lt;span class="nx"&gt;Content&lt;/span&gt;
&lt;span class="nx"&gt;ContentObjective&lt;/span&gt;
&lt;span class="nx"&gt;FlagPost&lt;/span&gt;
&lt;span class="nx"&gt;StorySequence&lt;/span&gt;
&lt;span class="nx"&gt;StoryFrame&lt;/span&gt;
&lt;span class="nx"&gt;AiBrief&lt;/span&gt;
&lt;span class="nx"&gt;KnowledgeItem&lt;/span&gt;
&lt;span class="nx"&gt;Memory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each one represents a part of the process.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Campaign&lt;/code&gt; organizes the broader context.&lt;br&gt;
&lt;code&gt;ContentPlan&lt;/code&gt; represents the editorial plan.&lt;br&gt;
&lt;code&gt;ContentObjective&lt;/code&gt; defines the reason for that content's existence.&lt;br&gt;
&lt;code&gt;AiBrief&lt;/code&gt; stores a structured request for intelligent assistance.&lt;br&gt;
&lt;code&gt;KnowledgeItem&lt;/code&gt; represents reusable knowledge.&lt;br&gt;
&lt;code&gt;StorySequence&lt;/code&gt; allows for modeling composite content, such as sequences of Stories.&lt;/p&gt;

&lt;p&gt;This modeling helps prevent everything from turning into just a generic "tasks" table.&lt;/p&gt;
&lt;h2&gt;
  
  
  Editorial pipeline
&lt;/h2&gt;

&lt;p&gt;Another central aspect of the project is the editorial pipeline.&lt;/p&gt;

&lt;p&gt;Content isn't born ready-made. It typically goes through stages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;idea&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;planned&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;scripted&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;recorded&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;edited&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;ready&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;published&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;archived&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This cycle makes it possible to understand the stage of each item and identify any bottlenecks.&lt;/p&gt;

&lt;p&gt;In practice, this enables views such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;content by status;&lt;/li&gt;
&lt;li&gt;weekly calendar;&lt;/li&gt;
&lt;li&gt;items ready to publish;&lt;/li&gt;
&lt;li&gt;pending scripts;&lt;/li&gt;
&lt;li&gt;recorded but unedited content;&lt;/li&gt;
&lt;li&gt;published content;&lt;/li&gt;
&lt;li&gt;campaigns lacking sufficient content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is for the system to function as an operational layer, not just a data entry tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI as a product capability, not just a loose prompt
&lt;/h2&gt;

&lt;p&gt;An important part of the project is using AI to support the creation of briefs, scripts, content sequences, and suggestions for platform-specific adaptations.&lt;/p&gt;

&lt;p&gt;However, I am trying to approach AI from an architectural perspective.&lt;/p&gt;

&lt;p&gt;Instead of simply saving free-form prompts and calling a specific model directly, the idea is to move toward a model based on intentions and contracts. For example, instead of simply thinking:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"generate an Instagram post about this campaign"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;the system can structure something closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;generate_content_brief&lt;/span&gt;
&lt;span class="nx"&gt;campaign_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="nx"&gt;objective&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="nx"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;instagram_reels&lt;/span&gt;
&lt;span class="nx"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;short_video&lt;/span&gt;
&lt;span class="nx"&gt;constraints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="nx"&gt;tone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach makes it easier to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;switch AI providers in the future;&lt;/li&gt;
&lt;li&gt;test workflows without always relying on actual API calls;&lt;/li&gt;
&lt;li&gt;audit the context used;&lt;/li&gt;
&lt;li&gt;separate business logic from the prompt;&lt;/li&gt;
&lt;li&gt;standardize inputs and outputs;&lt;/li&gt;
&lt;li&gt;reduce coupling between the product and the vendor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To me, this is an increasingly important aspect of AI-powered products: AI needs to be a capability integrated into the system, not a dependency hidden within loose text strings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory and knowledge
&lt;/h2&gt;

&lt;p&gt;Another interesting challenge is handling reusable knowledge.&lt;/p&gt;

&lt;p&gt;In a growth system, not everything is content. There is information that needs to be remembered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tone of voice;&lt;/li&gt;
&lt;li&gt;communication preferences;&lt;/li&gt;
&lt;li&gt;target audience;&lt;/li&gt;
&lt;li&gt;lessons learned from previous campaigns;&lt;/li&gt;
&lt;li&gt;messages that worked;&lt;/li&gt;
&lt;li&gt;messages that didn't work;&lt;/li&gt;
&lt;li&gt;brand constraints;&lt;/li&gt;
&lt;li&gt;editorial standards;&lt;/li&gt;
&lt;li&gt;validated hypotheses;&lt;/li&gt;
&lt;li&gt;discarded ideas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why the project separates operational content from knowledge items.&lt;/p&gt;

&lt;p&gt;The idea is for the system to be able to distinguish between, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a fact;&lt;/li&gt;
&lt;li&gt;a preference;&lt;/li&gt;
&lt;li&gt;a rule;&lt;/li&gt;
&lt;li&gt;a hypothesis;&lt;/li&gt;
&lt;li&gt;a lesson learned;&lt;/li&gt;
&lt;li&gt;an editorial guideline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is essential to ensure the AI ​​doesn't receive disorganized context and that future decisions are more consistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metrics and continuous learning
&lt;/h2&gt;

&lt;p&gt;The next step is connecting planning and results.&lt;/p&gt;

&lt;p&gt;Publishing content is only part of the process. Real value emerges when we understand what happened afterward.&lt;/p&gt;

&lt;p&gt;Even if metrics are initially entered manually, the structure needs to allow for analyses such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which formats performed best;&lt;/li&gt;
&lt;li&gt;which platforms generated the most response;&lt;/li&gt;
&lt;li&gt;which objectives gained the most traction;&lt;/li&gt;
&lt;li&gt;which campaigns yielded the most insights;&lt;/li&gt;
&lt;li&gt;which content is worth repurposing;&lt;/li&gt;
&lt;li&gt;which hypotheses were reinforced or discarded.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point here isn't to build an advanced analytics tool right from the start. It is to create a foundation where metrics and lessons learned can be linked back to the original plan.&lt;/p&gt;

&lt;p&gt;Without this, the process becomes nothing more than continuous production—without continuous improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical stack
&lt;/h2&gt;

&lt;p&gt;At this initial stage, I am using a modern and relatively lean stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;
&lt;span class="nx"&gt;React&lt;/span&gt;
&lt;span class="nx"&gt;TypeScript&lt;/span&gt;
&lt;span class="nx"&gt;Prisma&lt;/span&gt;
&lt;span class="nx"&gt;SQLite&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;PostgreSQL&lt;/span&gt;
&lt;span class="nx"&gt;Zod&lt;/span&gt;
&lt;span class="nx"&gt;Vitest&lt;/span&gt;
&lt;span class="nx"&gt;Tailwind&lt;/span&gt;
&lt;span class="nx"&gt;shadcn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choosing Next.js and TypeScript allows me to work on the product, interface, and backend within a single codebase. Prisma helps formalize the domain and keep the database's evolution under better control.&lt;/p&gt;

&lt;p&gt;Vitest is primarily used to validate business rules, status transitions, contracts, and critical behaviors.&lt;/p&gt;

&lt;p&gt;The goal isn't just to make the system work, but to maintain a codebase that is both evolvable and testable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key technical challenges
&lt;/h2&gt;

&lt;p&gt;Some challenges have been particularly interesting:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Separating the product from specific use cases
The system might originate from a specific pain point, but it needs to be modeled generically enough to serve other contexts.&lt;/li&gt;
&lt;li&gt;Avoiding the "everything is a task" trap
Campaigns, content, scripts, learning, and metrics are distinct things. Mixing them all together simplifies things at the start but hinders future evolution.&lt;/li&gt;
&lt;li&gt;Handling AI with governance
Using AI is simple. Integrating AI with traceability, context, fallbacks, and human review is a different story.&lt;/li&gt;
&lt;li&gt;Creating a useful memory
Storing information is easy. The hard part is organizing knowledge so it remains reusable rather than turning into noise.&lt;/li&gt;
&lt;li&gt;Balancing scope and delivery
A system like this can quickly become bloated. That’s why I’m prioritizing a functional MVP over more sophisticated features.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;p&gt;The project's next steps are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consolidating the campaign workflow;&lt;/li&gt;
&lt;li&gt;improving the editorial calendar;&lt;/li&gt;
&lt;li&gt;better structuring smart briefs;&lt;/li&gt;
&lt;li&gt;creating a reusable knowledge layer;&lt;/li&gt;
&lt;li&gt;adding manual metrics;&lt;/li&gt;
&lt;li&gt;documenting technical decisions;&lt;/li&gt;
&lt;li&gt;publishing a demo version;&lt;/li&gt;
&lt;li&gt;maintaining the repository with a README, screenshots, architecture details, and tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More than just creating a finished tool, this project has served as a laboratory for thinking about product, architecture, and automation in an integrated way.&lt;/p&gt;

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

&lt;p&gt;Personal projects can go beyond CRUD apps, clones, and tutorials.&lt;/p&gt;

&lt;p&gt;When we choose a domain involving real-world problems, even a small project can demonstrate a great deal: modeling, architecture, product design, testing, applied AI, and the ability to transform messy processes into clearer systems.&lt;/p&gt;

&lt;p&gt;That is the goal of this laboratory. To build a system that helps plan, execute, and learn from growth campaigns, while also serving as a technical showcase of well-considered decisions.&lt;/p&gt;

&lt;p&gt;Ultimately, the most interesting technology isn't the kind that merely automates tasks.&lt;/p&gt;

&lt;p&gt;It is the kind that best organizes the decision-making process.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>management</category>
      <category>marketing</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
