<?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: David Kljajo</title>
    <description>The latest articles on DEV Community by David Kljajo (@davidkljajo).</description>
    <link>https://dev.to/davidkljajo</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%2F3837767%2Fef33d37d-742d-4fce-941e-6f8af99b5201.jpg</url>
      <title>DEV Community: David Kljajo</title>
      <link>https://dev.to/davidkljajo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/davidkljajo"/>
    <language>en</language>
    <item>
      <title>Stećak Oracle: Exploring Medieval Stone Monuments with Sanity and Gemini</title>
      <dc:creator>David Kljajo</dc:creator>
      <pubDate>Sat, 19 Sep 2026 16:22:13 +0000</pubDate>
      <link>https://dev.to/davidkljajo/-stecak-oracle-exploring-medieval-stone-monuments-with-sanity-and-gemini-4hk9</link>
      <guid>https://dev.to/davidkljajo/-stecak-oracle-exploring-medieval-stone-monuments-with-sanity-and-gemini-4hk9</guid>
      <description>&lt;p&gt;I decided to build something around a subject that is very close to where I live: &lt;strong&gt;stećci&lt;/strong&gt;, the medieval tombstone monuments found across Bosnia and Herzegovina and neighboring countries.&lt;/p&gt;

&lt;p&gt;The result is &lt;strong&gt;Stećak Oracle&lt;/strong&gt;, a small knowledge-driven web application that combines &lt;strong&gt;Sanity&lt;/strong&gt;, &lt;strong&gt;Next.js&lt;/strong&gt;, and &lt;strong&gt;Google Gemini&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Store structured historical information in Sanity, then let an AI model answer questions using that information as its knowledge base.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This project was built for the &lt;strong&gt;Sanity Challenge&lt;/strong&gt;.&lt;/p&gt;




&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%2Fe24py03sfdiposgp9wmh.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%2Fe24py03sfdiposgp9wmh.png" alt=" " width="799" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;Stećci are medieval tombstones found across Bosnia and Herzegovina, Croatia, Montenegro and Serbia.&lt;/p&gt;

&lt;p&gt;There is a huge amount of historical information around them, but I wanted to approach the subject from a developer's perspective.&lt;/p&gt;

&lt;p&gt;Instead of building another static website with paragraphs of text, I wanted to experiment with a small structured knowledge system.&lt;/p&gt;

&lt;p&gt;The application would contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;individual stećak records&lt;/li&gt;
&lt;li&gt;locations&lt;/li&gt;
&lt;li&gt;historical periods&lt;/li&gt;
&lt;li&gt;descriptions&lt;/li&gt;
&lt;li&gt;inscriptions&lt;/li&gt;
&lt;li&gt;motifs&lt;/li&gt;
&lt;li&gt;historical context&lt;/li&gt;
&lt;li&gt;documented sources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I wanted to put an AI interface on top of that data.&lt;/p&gt;

&lt;p&gt;That became Stećak Oracle.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Sanity?
&lt;/h2&gt;

&lt;p&gt;The first important decision was how to structure the information.&lt;/p&gt;

&lt;p&gt;I didn't want everything to be stored as one large JSON document or hardcoded directly into the application.&lt;/p&gt;

&lt;p&gt;Sanity was a good fit because I could create actual content types and relationships between them.&lt;/p&gt;

&lt;p&gt;The main content model became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stećak
 ├── Motifs
 ├── Sources
 └── Historical information

Motif
 ├── Description
 ├── Interpretations
 └── Interpretation caution

Source
 ├── Title
 ├── URL
 ├── Publisher
 ├── Type
 └── Notes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This also made the project more interesting from a development perspective.&lt;/p&gt;

&lt;p&gt;The AI doesn't have to be the source of truth.&lt;/p&gt;

&lt;p&gt;Sanity is the structured knowledge layer.&lt;/p&gt;

&lt;p&gt;Gemini is the generation layer.&lt;/p&gt;




&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%2Fo98h0fa12w2ue8anm37p.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%2Fo98h0fa12w2ue8anm37p.png" alt=" " width="799" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The content model
&lt;/h2&gt;

&lt;p&gt;I created three main document types in Sanity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stećak
&lt;/h3&gt;

&lt;p&gt;A stećak contains information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name&lt;/li&gt;
&lt;li&gt;slug&lt;/li&gt;
&lt;li&gt;location&lt;/li&gt;
&lt;li&gt;region&lt;/li&gt;
&lt;li&gt;historical period&lt;/li&gt;
&lt;li&gt;description&lt;/li&gt;
&lt;li&gt;inscription&lt;/li&gt;
&lt;li&gt;motifs&lt;/li&gt;
&lt;li&gt;historical context&lt;/li&gt;
&lt;li&gt;sources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, one of the records is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stećak Radimlja — Vojvoda Vlatko Vuković&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;with Radimlja near Stolac as the location.&lt;/p&gt;

&lt;h3&gt;
  
  
  Motif
&lt;/h3&gt;

&lt;p&gt;Motifs are separate documents because the same motif can appear on multiple monuments.&lt;/p&gt;

&lt;p&gt;For example, the project contains a &lt;code&gt;Sword&lt;/code&gt; motif.&lt;/p&gt;

&lt;p&gt;But there is an important detail here.&lt;/p&gt;

&lt;p&gt;I didn't want to tell the AI that a particular interpretation is an absolute historical fact.&lt;/p&gt;

&lt;p&gt;So the motif also contains an &lt;strong&gt;Interpretation Caution&lt;/strong&gt; field.&lt;/p&gt;

&lt;p&gt;That allows the application to distinguish between documented information and interpretation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Source
&lt;/h3&gt;

&lt;p&gt;Sources are separate documents as well.&lt;/p&gt;

&lt;p&gt;For the initial dataset I used institutional information from the &lt;strong&gt;UNESCO World Heritage Centre&lt;/strong&gt;, including the Stećci Medieval Tombstone Graveyards entry.&lt;/p&gt;

&lt;p&gt;This gives the application a simple evidence layer rather than treating AI-generated text as the source itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building the frontend
&lt;/h2&gt;

&lt;p&gt;The frontend is built with &lt;strong&gt;Next.js&lt;/strong&gt; and TypeScript.&lt;/p&gt;

&lt;p&gt;The application has several main areas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/
├── Home
├── /stecci
├── /stecci/[slug]
├── /motifs
├── /sources
└── /oracle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The homepage retrieves the current number of records directly from Sanity.&lt;/p&gt;

&lt;p&gt;That means the statistics are not hardcoded.&lt;/p&gt;

&lt;p&gt;If I add another stećak or source in Sanity, the application can reflect that change.&lt;/p&gt;




&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%2Fy19vtgj28ebzop8479fd.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%2Fy19vtgj28ebzop8479fd.png" alt=" " width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Stećak detail pages
&lt;/h2&gt;

&lt;p&gt;Each stećak has its own dynamic page.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/stecci/stecak-radimlja-vojvoda-vlatko-vukovic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The page retrieves the document from Sanity using its slug.&lt;/p&gt;

&lt;p&gt;It also dereferences related motifs and sources.&lt;/p&gt;

&lt;p&gt;This was useful because the frontend doesn't need to duplicate the actual content model.&lt;/p&gt;

&lt;p&gt;Sanity remains responsible for the data.&lt;/p&gt;




&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%2Fyy5mufw9njtsfryodhkb.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%2Fyy5mufw9njtsfryodhkb.png" alt=" " width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding the Oracle
&lt;/h2&gt;

&lt;p&gt;The final piece was the AI interface.&lt;/p&gt;

&lt;p&gt;The Oracle page allows a user to ask a question about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stećci&lt;/li&gt;
&lt;li&gt;motifs&lt;/li&gt;
&lt;li&gt;history&lt;/li&gt;
&lt;li&gt;documented evidence&lt;/li&gt;
&lt;/ul&gt;

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

&lt;blockquote&gt;
&lt;p&gt;What does the sword motif on the Radimlja stećak represent?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The frontend sends the question to a Next.js API route.&lt;/p&gt;

&lt;p&gt;The basic flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
  ↓
Oracle UI
  ↓
Next.js API route
  ↓
Sanity
  ↓
Knowledge base
  ↓
Gemini
  ↓
Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&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%2Fxwljcxkos4jtnzdcw3mn.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%2Fxwljcxkos4jtnzdcw3mn.png" alt=" " width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting Gemini
&lt;/h2&gt;

&lt;p&gt;I initially experimented with the Anthropic API.&lt;/p&gt;

&lt;p&gt;The API itself worked, but I didn't have API credits available, so I decided not to add another paid dependency to the project.&lt;/p&gt;

&lt;p&gt;I switched to Google Gemini through the &lt;code&gt;@google/genai&lt;/code&gt; package.&lt;/p&gt;

&lt;p&gt;The application uses an environment variable for the API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GEMINI_API_KEY=...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key is stored in &lt;code&gt;.env.local&lt;/code&gt; and is excluded from Git.&lt;/p&gt;

&lt;p&gt;The actual API request is made server-side through the Next.js API route.&lt;/p&gt;

&lt;p&gt;This is important because the API key should not be exposed in browser-side JavaScript.&lt;/p&gt;




&lt;h2&gt;
  
  
  The important part: grounding Gemini with Sanity
&lt;/h2&gt;

&lt;p&gt;This is probably the most important technical part of the project.&lt;/p&gt;

&lt;p&gt;I didn't want to simply send the user's question to Gemini and display whatever it returned.&lt;/p&gt;

&lt;p&gt;Instead, the API route first retrieves the knowledge base from Sanity.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;knowledgeBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getKnowledgeBase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The query retrieves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stećci
Motifs
Sources
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;including their relationships.&lt;/p&gt;

&lt;p&gt;The resulting data is then serialized and included in the Gemini prompt.&lt;/p&gt;

&lt;p&gt;The model receives something conceptually like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here is the knowledge base from Sanity:

{
  "stecci": [...],
  "motifs": [...],
  "sources": [...]
}

You are the Stećak Oracle...

Answer this question clearly and carefully:

[user question]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also explicitly tell the model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Do not invent historical facts.
- Distinguish documented facts from interpretation.
- If the available information is insufficient, say so.
- Keep the answer concise.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a small dataset like this, sending the complete knowledge base is simple enough.&lt;/p&gt;

&lt;p&gt;For a much larger project, I would definitely replace this with retrieval of only the most relevant documents.&lt;/p&gt;




&lt;h2&gt;
  
  
  A real example
&lt;/h2&gt;

&lt;p&gt;I tested the Oracle with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What does the sword motif on the Radimlja stećak represent?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The response used the information stored in Sanity.&lt;/p&gt;

&lt;p&gt;It identified the sword as a recurring figural motif and, importantly, preserved the caution around interpretation.&lt;/p&gt;

&lt;p&gt;The answer did not present the interpretation as an absolute fact.&lt;/p&gt;

&lt;p&gt;That distinction was intentional.&lt;/p&gt;

&lt;p&gt;Historical subjects are a good example of why an AI application should be careful about the difference between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;documented information
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interpretation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&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%2Fat93hop8jlsipl1ol5cq.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%2Fat93hop8jlsipl1ol5cq.png" alt=" " width="799" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this approach?
&lt;/h2&gt;

&lt;p&gt;One thing I wanted to avoid was building a generic chatbot and simply giving it a historical theme.&lt;/p&gt;

&lt;p&gt;The interesting part of the project is the relationship between the CMS and the AI model.&lt;/p&gt;

&lt;p&gt;The architecture is closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             ┌───────────────┐
             │     User      │
             └───────┬───────┘
                     │
                     ▼
             ┌───────────────┐
             │    Next.js    │
             │    Frontend   │
             └───────┬───────┘
                     │
                     ▼
             ┌───────────────┐
             │  API Route    │
             └───────┬───────┘
                     │
             ┌───────┴────────┐
             ▼                ▼
      ┌────────────┐   ┌────────────┐
      │   Sanity   │   │   Gemini   │
      │ Knowledge  │──▶│    AI      │
      │   Base     │   │            │
      └────────────┘   └──────┬─────┘
                              │
                              ▼
                       ┌────────────┐
                       │   Answer   │
                       └────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sanity provides the structured information.&lt;/p&gt;

&lt;p&gt;Gemini turns that information into a natural-language answer.&lt;/p&gt;

&lt;p&gt;Next.js connects everything together.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;The project ended up teaching me a few things that were more interesting than I expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Structured data matters
&lt;/h3&gt;

&lt;p&gt;It is tempting to start an AI project with only a prompt.&lt;/p&gt;

&lt;p&gt;But once you have structured content, relationships and sources, you can build something much more controlled.&lt;/p&gt;

&lt;p&gt;The content model became just as important as the AI integration.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AI needs boundaries
&lt;/h3&gt;

&lt;p&gt;For historical information, I don't want the model to confidently invent an interpretation.&lt;/p&gt;

&lt;p&gt;That's why the knowledge base includes fields 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;Interpretations
Interpretation Caution
Sources
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application can then give the model some context about how information should be treated.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A small dataset is enough to prove the concept
&lt;/h3&gt;

&lt;p&gt;I didn't need hundreds of monuments to build the first version.&lt;/p&gt;

&lt;p&gt;Two stećak records, a motif and documented sources were enough to demonstrate the architecture.&lt;/p&gt;

&lt;p&gt;The important part was making the entire pipeline work.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Keep the architecture simple first
&lt;/h3&gt;

&lt;p&gt;For this challenge, I intentionally didn't build a complicated vector database or RAG pipeline.&lt;/p&gt;

&lt;p&gt;The dataset is small enough that retrieving the complete knowledge base is reasonable.&lt;/p&gt;

&lt;p&gt;If the project grows, the architecture can evolve.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I would improve next
&lt;/h2&gt;

&lt;p&gt;There are several things I would add to a future version.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better retrieval
&lt;/h3&gt;

&lt;p&gt;Instead of sending every Sanity document to Gemini, I would retrieve only the documents relevant to the question.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question
   ↓
Search Sanity
   ↓
Relevant stećak
Relevant motifs
Relevant sources
   ↓
Gemini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That would scale much better.&lt;/p&gt;

&lt;h3&gt;
  
  
  More stećci
&lt;/h3&gt;

&lt;p&gt;The obvious next step is a larger dataset covering more locations across Bosnia and Herzegovina and the wider region.&lt;/p&gt;

&lt;h3&gt;
  
  
  Better source presentation
&lt;/h3&gt;

&lt;p&gt;The next version could show sources directly underneath individual claims or sections of an answer.&lt;/p&gt;

&lt;p&gt;That would make the evidence trail more visible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Images
&lt;/h3&gt;

&lt;p&gt;The current version is deliberately data-first.&lt;/p&gt;

&lt;p&gt;I didn't have a suitable image collection for every monument, so I chose not to invent one or fill the application with unrelated images.&lt;/p&gt;

&lt;p&gt;A future version could add properly sourced photographs and image metadata to the Sanity model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Search and filtering
&lt;/h3&gt;

&lt;p&gt;I would also add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;location filtering&lt;/li&gt;
&lt;li&gt;region filtering&lt;/li&gt;
&lt;li&gt;historical period filtering&lt;/li&gt;
&lt;li&gt;motif filtering&lt;/li&gt;
&lt;li&gt;full-text search&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That would make the knowledge base useful even without the AI interface.&lt;/p&gt;




&lt;p&gt;github repo:&lt;a href="https://github.com/dkljajo/Ste-ak-Oracle-frontend-and-Gemini-integration" rel="noopener noreferrer"&gt;https://github.com/dkljajo/Ste-ak-Oracle-frontend-and-Gemini-integration&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Technology stack
&lt;/h2&gt;

&lt;p&gt;The current version uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tailwind CSS&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sanity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Gemini&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/sanity"&gt;@sanity&lt;/a&gt;/client&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;@google/genai&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git / GitHub&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application is intentionally small.&lt;/p&gt;

&lt;p&gt;There is no separate backend service.&lt;/p&gt;

&lt;p&gt;The Next.js API route handles the server-side Gemini request and retrieves the Sanity data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project structure
&lt;/h2&gt;

&lt;p&gt;The important parts of the repository look roughly 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;stecak-oracle/
├── studio/
│   ├── schemaTypes/
│   │   ├── stecak.ts
│   │   ├── motif.ts
│   │   └── source.ts
│   └── sanity.config.ts
│
└── web/
    ├── app/
    │   ├── api/
    │   │   └── oracle/
    │   │       └── route.ts
    │   ├── motifs/
    │   ├── oracle/
    │   ├── sources/
    │   └── stecci/
    └── lib/
        └── sanity.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separation also makes the architecture easy to understand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;studio/
    → content model and Sanity configuration

web/
    → application and AI interface
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final result
&lt;/h2&gt;

&lt;p&gt;Stećak Oracle started as a simple idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if I could combine a structured historical knowledge base with an AI interface?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The final application is still small, but the complete pipeline works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sanity
  ↓
Structured historical knowledge
  ↓
Next.js
  ↓
Gemini
  ↓
Grounded answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's what I wanted to demonstrate with this project.&lt;/p&gt;

&lt;p&gt;Not a generic chatbot.&lt;/p&gt;

&lt;p&gt;Not an AI that simply talks about stećci.&lt;/p&gt;

&lt;p&gt;A small application where the content has structure, sources and relationships, and where the AI uses that content to generate an answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;There is a lot of room to take this further.&lt;/p&gt;

&lt;p&gt;I would like to expand the dataset, improve retrieval, add properly sourced images, expose citations more clearly, and eventually turn the Oracle into a more complete exploration tool for stećci.&lt;/p&gt;

&lt;p&gt;For now, I'm happy that the basic idea works end-to-end.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project
&lt;/h2&gt;

&lt;p&gt;The source code is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stećak Oracle — Sanity + Next.js + Gemini&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/dkljajo/Ste-ak-Oracle-frontend-and-Gemini-integration" rel="noopener noreferrer"&gt;https://github.com/dkljajo/Ste-ak-Oracle-frontend-and-Gemini-integration&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Built for the Sanity Challenge
&lt;/h2&gt;

&lt;p&gt;This project was built as my submission for the &lt;strong&gt;Sanity Challenge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The challenge gave me a good excuse to combine several things I've been learning and working with: cloud technologies, application development, structured content, APIs and AI.&lt;/p&gt;

&lt;p&gt;More importantly, it gave me a reason to build something connected to the history and culture of the region I live in.&lt;/p&gt;

&lt;p&gt;That was the part I enjoyed most.&lt;/p&gt;




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

&lt;p&gt;Stećak Oracle is a small project, but it brought together several technologies that I wanted to understand better.&lt;/p&gt;

&lt;p&gt;Sanity handles the content.&lt;/p&gt;

&lt;p&gt;Next.js handles the application.&lt;/p&gt;

&lt;p&gt;Gemini handles the natural-language generation.&lt;/p&gt;

&lt;p&gt;And the interesting part is what happens between them.&lt;/p&gt;

&lt;p&gt;The result is a simple example of how a structured CMS can become the foundation for a grounded AI application.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

&lt;p&gt;If you have ideas for improving the project, I'd be interested in hearing them.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tags
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;#sanity&lt;/code&gt; &lt;code&gt;#nextjs&lt;/code&gt; &lt;code&gt;#typescript&lt;/code&gt; &lt;code&gt;#ai&lt;/code&gt; &lt;code&gt;#gemini&lt;/code&gt; &lt;code&gt;#webdev&lt;/code&gt;&lt;/p&gt;

</description>
      <category>sanitychallenge</category>
      <category>gemini</category>
      <category>ai</category>
      <category>typescript</category>
    </item>
    <item>
      <title>I Built an AI Assistant for the Most Legendary Car in the Balkans</title>
      <dc:creator>David Kljajo</dc:creator>
      <pubDate>Thu, 02 Apr 2026 04:09:36 +0000</pubDate>
      <link>https://dev.to/davidkljajo/i-built-an-ai-assistant-for-the-most-legendary-car-in-the-balkans-362</link>
      <guid>https://dev.to/davidkljajo/i-built-an-ai-assistant-for-the-most-legendary-car-in-the-balkans-362</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the DEV April Fools Challenge&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  🚗 Golf 2 AI Assistant™
&lt;/h1&gt;

&lt;h3&gt;
  
  
  The first AI that thinks like a Balkan driver
&lt;/h3&gt;




&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.amazonaws.com%2Fuploads%2Farticles%2F2w6dz5bliubs7saccobw.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.amazonaws.com%2Fuploads%2Farticles%2F2w6dz5bliubs7saccobw.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;While the world is busy building AI for self-driving cars, I asked a more important question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if AI behaved like someone who refuses to sell their Volkswagen Golf Mk2?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I built &lt;strong&gt;Golf 2 AI Assistant™&lt;/strong&gt; — a completely useless (but highly accurate) AI that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ignores real data&lt;/li&gt;
&lt;li&gt;gives confident but questionable advice&lt;/li&gt;
&lt;li&gt;and always knows “a better way”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not artificial intelligence.&lt;br&gt;
This is &lt;strong&gt;artificial Balkan intelligence&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🎬 Imagine this scenario:&lt;/p&gt;

&lt;p&gt;You:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Navigate to city center”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Ma znam ja bolji put.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What happens next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You go through 3 random villages&lt;/li&gt;
&lt;li&gt;You stop for coffee you didn’t plan&lt;/li&gt;
&lt;li&gt;You question your life decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You arrive 30 minutes late.&lt;/p&gt;

&lt;p&gt;AI:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Eto vidiš, stigli smo.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ma znam ja bolji put.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;route&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prečica&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;duži ali sigurniji put (nije)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prečica&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// minutes&lt;/span&gt;
    &lt;span class="nf"&gt;stopAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;kafana&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Stigli smo nekako.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;detectProblem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;issue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ma nije to ništa.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fuelCheck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ima još, ne brini.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Kako sad 0?!&lt;/span&gt;&lt;span class="dl"&gt;"&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;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Tech stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TrustMeBro.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LocalKnowledge v1986&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;console.log()&lt;/code&gt; for all outputs&lt;/li&gt;
&lt;li&gt;Zero APIs, zero validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Training data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Balkan forums&lt;/li&gt;
&lt;li&gt;YouTube comments&lt;/li&gt;
&lt;li&gt;Unverified advice from relatives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Model accuracy: ❌&lt;br&gt;
Model confidence: ✅ 100%&lt;/p&gt;




&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧔 Ćale Mode
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ignores GPS&lt;/li&gt;
&lt;li&gt;Uses landmarks like “kod stare pumpe”&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🚬 Kafana Mode
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Suggests coffee every 5 minutes&lt;/li&gt;
&lt;li&gt;Navigation becomes emotional&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧢 Majstor Mode
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Ma može još.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;All problems are temporary&lt;/li&gt;
&lt;li&gt;Nothing is urgent&lt;/li&gt;
&lt;li&gt;Everything lasts “još 10 godina”&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🚔 Police Detection
&lt;/h3&gt;

&lt;p&gt;Powered by instinct:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Ovdje uvijek stoje.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(They don’t.)&lt;/p&gt;




&lt;h3&gt;
  
  
  🪑 Smart Parking™
&lt;/h3&gt;

&lt;p&gt;Reserves parking using a &lt;strong&gt;virtual chair&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Community Favorite&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you’re from the Balkans, this is not satire — it’s documentation&lt;/li&gt;
&lt;li&gt;If you’re not, this is a cultural experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, this project is spiritually aligned with Top lista nadrealista:&lt;br&gt;
slightly absurd, deeply accurate, and completely unnecessary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;We don’t need smarter AI.&lt;/p&gt;

&lt;p&gt;We need AI that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;insists it’s right&lt;/li&gt;
&lt;li&gt;refuses better solutions&lt;/li&gt;
&lt;li&gt;and somehow still gets the job done&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If this gets enough love, I’ll ship:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Veza Mode™&lt;/strong&gt; (skip traffic via “connections”)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote Majstor API™&lt;/strong&gt; (“udari malo tu i radiće”)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Built with ❤️, stubbornness, and zero documentation.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>ai</category>
      <category>humor</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Core Event-Driven Concepts - project 3</title>
      <dc:creator>David Kljajo</dc:creator>
      <pubDate>Tue, 31 Mar 2026 06:04:42 +0000</pubDate>
      <link>https://dev.to/davidkljajo/core-event-driven-concepts-project-3-2lf7</link>
      <guid>https://dev.to/davidkljajo/core-event-driven-concepts-project-3-2lf7</guid>
      <description>&lt;p&gt;Week 5 — Core Event-Driven Concepts&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Learn (Day 1–2)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Understand:&lt;/p&gt;

&lt;p&gt;🔹 SQS&lt;br&gt;
Message queue&lt;br&gt;
Stores tasks until processed&lt;br&gt;
One consumer processes message&lt;br&gt;
🔹 SNS&lt;br&gt;
Pub/sub system&lt;br&gt;
Sends same message to multiple subscribers&lt;br&gt;
🔹 EventBridge&lt;br&gt;
Smart event router&lt;br&gt;
Filters and routes events based on rules&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extend Your Existing App (Day 2–3)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start from your Phase 2 API (Orders or Users system).&lt;/p&gt;

&lt;p&gt;Modify:&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
API → DB only&lt;br&gt;
Now:&lt;br&gt;
API → DB + Event Published&lt;/p&gt;

&lt;p&gt;Example event:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "eventType": "ORDER_CREATED",&lt;br&gt;
  "orderId": "123",&lt;br&gt;
  "userId": "abc",&lt;br&gt;
  "timestamp": "..."&lt;br&gt;
}&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add EventBridge (Day 3–4)
Create:
EventBridge Event Bus (custom bus)
Flow:
Order Lambda sends event → EventBridge
Rule:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Route based on:&lt;/p&gt;

&lt;p&gt;eventType = ORDER_CREATED&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create First Consumer (Day 4–5)
Lambda: Email Simulation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Triggered by EventBridge&lt;/p&gt;

&lt;p&gt;Does:&lt;/p&gt;

&lt;p&gt;Logs email message like:&lt;/p&gt;

&lt;p&gt;"Email sent to user for order 123"&lt;/p&gt;

&lt;p&gt;👉 This simulates async email system&lt;/p&gt;

&lt;p&gt;📅 Week 6 — Scale with SQS + SNS&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add SQS for Reliable Processing (Day 1–2)
Use case:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Order processing queue&lt;/p&gt;

&lt;p&gt;Flow:&lt;/p&gt;

&lt;p&gt;EventBridge → SQS Queue → Lambda Consumer&lt;/p&gt;

&lt;p&gt;Why:&lt;/p&gt;

&lt;p&gt;Ensures no event is lost&lt;br&gt;
Can retry automatically&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add SNS for Fan-out (Day 2–3)
Use case:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One event → multiple systems&lt;/p&gt;

&lt;p&gt;Flow:&lt;/p&gt;

&lt;p&gt;Order Created → SNS Topic&lt;br&gt;
                ↓      ↓      ↓&lt;br&gt;
             Email   Analytics   Logging&lt;/p&gt;

&lt;p&gt;Each Lambda subscribes to SNS topic.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build 3 Async Consumers (Day 3–4)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create Lambdas:&lt;/p&gt;

&lt;p&gt;📧 Email Service Lambda&lt;br&gt;
📊 Analytics Lambda&lt;br&gt;
🪵 Logging Lambda&lt;/p&gt;

&lt;p&gt;Each one:&lt;/p&gt;

&lt;p&gt;Triggered by SNS or SQS&lt;br&gt;
Runs independently&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Observability (Day 4–5)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;p&gt;CloudWatch logs&lt;br&gt;
Event tracing&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;p&gt;Event delivery&lt;br&gt;
Lambda execution logs&lt;br&gt;
Queue processing&lt;br&gt;
🧠 Final Architecture (What you’ve built)&lt;/p&gt;

&lt;p&gt;You now have:&lt;/p&gt;

&lt;p&gt;🚀 Event-driven system:&lt;br&gt;
API creates order&lt;br&gt;
Event published&lt;br&gt;
Multiple services react independently&lt;br&gt;
🧩 Final Outcome Statement&lt;/p&gt;

&lt;p&gt;After this phase, you can confidently say:&lt;/p&gt;

&lt;p&gt;“I design event-driven systems using AWS services like SQS, SNS, and EventBridge to build scalable, decoupled architectures.”&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AWS Serverless API Project Plan 2</title>
      <dc:creator>David Kljajo</dc:creator>
      <pubDate>Tue, 31 Mar 2026 06:02:10 +0000</pubDate>
      <link>https://dev.to/davidkljajo/aws-serverless-api-project-plan-2-41j7</link>
      <guid>https://dev.to/davidkljajo/aws-serverless-api-project-plan-2-41j7</guid>
      <description>&lt;p&gt;AWS Serverless API Project Plan&lt;br&gt;
🎯 Goal&lt;/p&gt;

&lt;p&gt;Convert your existing API into a fully serverless backend using:&lt;/p&gt;

&lt;p&gt;AWS Lambda&lt;br&gt;
Amazon API Gateway&lt;br&gt;
Amazon DynamoDB&lt;br&gt;
AWS IAM&lt;/p&gt;

&lt;p&gt;Deploy using:&lt;/p&gt;

&lt;p&gt;AWS SAM or Serverless Framework&lt;br&gt;
📅 Week 3 — Foundations + First Serverless API&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Learn (Day 1–2)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Focus only on what you need:&lt;/p&gt;

&lt;p&gt;What is AWS Lambda (event-driven functions)&lt;br&gt;
How API Gateway routes HTTP requests&lt;br&gt;
DynamoDB basics (tables, items, keys)&lt;br&gt;
IAM roles (what permissions Lambda needs)&lt;/p&gt;

&lt;p&gt;👉 Key understanding:&lt;/p&gt;

&lt;p&gt;API Gateway → triggers Lambda → reads/writes DynamoDB&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setup AWS Environment (Day 2)
Create AWS account (if not already)
Install:
AWS CLI
Node.js or Python runtime
AWS SAM CLI (recommended)
Configure CLI:
aws configure&lt;/li&gt;
&lt;li&gt;Build First Minimal Serverless API (Day 3–4)
Create:
1 Lambda function: helloAPI
1 API Gateway route:
GET /hello
Flow:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Client → API Gateway → Lambda → Response&lt;/p&gt;

&lt;p&gt;Outcome:&lt;/p&gt;

&lt;p&gt;You successfully deploy your first serverless endpoint.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add DynamoDB (Day 5)
Create table:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;Table: Users&lt;br&gt;
Partition key: userId&lt;br&gt;
Update Lambda:&lt;br&gt;
Write a simple item into DynamoDB&lt;br&gt;
Return stored data&lt;br&gt;
📅 Week 4 — Full CRUD Serverless API&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build Full CRUD API (Day 1–3)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create endpoints:&lt;/p&gt;

&lt;p&gt;Method  Route   Action&lt;br&gt;
POST    /users  Create user&lt;br&gt;
GET /users/{id} Get user&lt;br&gt;
PUT /users/{id} Update user&lt;br&gt;
DELETE  /users/{id} Delete user&lt;/p&gt;

&lt;p&gt;Each endpoint = Lambda function OR single Lambda with routing logic.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;IAM Roles (Day 3–4)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Give Lambda permissions:&lt;/p&gt;

&lt;p&gt;Read/write DynamoDB&lt;br&gt;
Basic execution logs (CloudWatch)&lt;/p&gt;

&lt;p&gt;Learn:&lt;/p&gt;

&lt;p&gt;Least privilege principle (only required permissions)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deploy Using SAM or Serverless Framework (Day 4–5)
Option A: AWS SAM (recommended)
template.yaml
sam build
sam deploy
Option B: Serverless Framework
serverless.yml
serverless deploy&lt;/li&gt;
&lt;li&gt;Testing + Debugging (Day 5)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Test with:&lt;/p&gt;

&lt;p&gt;Postman / Insomnia&lt;br&gt;
AWS logs (CloudWatch)&lt;/p&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;Permission errors&lt;br&gt;
API route issues&lt;br&gt;
DynamoDB key mismatches&lt;br&gt;
🧠 Final Outcome (What you should be able to say)&lt;/p&gt;

&lt;p&gt;After completing this phase, you can confidently say:&lt;/p&gt;

&lt;p&gt;“I build and deploy serverless APIs on AWS using Lambda, API Gateway, and DynamoDB with proper IAM roles and infrastructure-as-code tools like SAM.”&lt;/p&gt;

</description>
      <category>api</category>
      <category>aws</category>
      <category>beginners</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Mini E-Commerce API (FastAPI + JWT) - project 1</title>
      <dc:creator>David Kljajo</dc:creator>
      <pubDate>Tue, 31 Mar 2026 05:58:17 +0000</pubDate>
      <link>https://dev.to/davidkljajo/project1-planhtml-8hi</link>
      <guid>https://dev.to/davidkljajo/project1-planhtml-8hi</guid>
      <description>&lt;p&gt;🚀 Project: Mini E-Commerce API (FastAPI + JWT)&lt;br&gt;
🎯 What you’re building&lt;/p&gt;

&lt;p&gt;A backend system with:&lt;/p&gt;

&lt;p&gt;Users (auth system)&lt;br&gt;
Products (CRUD)&lt;br&gt;
Orders (user purchases)&lt;br&gt;
JWT authentication&lt;br&gt;
Clean architecture (like real production APIs)&lt;br&gt;
🧱 Tech Stack&lt;br&gt;
Python 3.11+&lt;br&gt;
FastAPI&lt;br&gt;
SQLAlchemy (ORM)&lt;br&gt;
SQLite (start) → PostgreSQL later&lt;br&gt;
JWT (python-jose)&lt;br&gt;
Passlib (password hashing)&lt;br&gt;
📁 Clean Project Structure (IMPORTANT)&lt;br&gt;
app/&lt;br&gt;
 ├── main.py&lt;br&gt;
 ├── core/&lt;br&gt;
 │    ├── config.py&lt;br&gt;
 │    ├── security.py&lt;br&gt;
 │&lt;br&gt;
 ├── database/&lt;br&gt;
 │    ├── db.py&lt;br&gt;
 │&lt;br&gt;
 ├── models/&lt;br&gt;
 │    ├── user.py&lt;br&gt;
 │    ├── product.py&lt;br&gt;
 │    ├── order.py&lt;br&gt;
 │&lt;br&gt;
 ├── schemas/&lt;br&gt;
 │    ├── user.py&lt;br&gt;
 │    ├── product.py&lt;br&gt;
 │    ├── order.py&lt;br&gt;
 │&lt;br&gt;
 ├── routes/&lt;br&gt;
 │    ├── auth.py&lt;br&gt;
 │    ├── users.py&lt;br&gt;
 │    ├── products.py&lt;br&gt;
 │    ├── orders.py&lt;br&gt;
 │&lt;br&gt;
 ├── services/&lt;br&gt;
 │    ├── user_service.py&lt;br&gt;
 │    ├── product_service.py&lt;br&gt;
 │    ├── order_service.py&lt;br&gt;
 │&lt;br&gt;
 ├── dependencies/&lt;br&gt;
 │    ├── auth.py&lt;/p&gt;

&lt;p&gt;This structure alone already makes your project look “production-grade”.&lt;/p&gt;

&lt;p&gt;🔐 Features Breakdown&lt;br&gt;
👤 Auth System&lt;br&gt;
Register user&lt;br&gt;
Login user&lt;br&gt;
Password hashing (bcrypt)&lt;br&gt;
JWT token generation&lt;br&gt;
Protected routes&lt;br&gt;
🛍️ Products (CRUD)&lt;br&gt;
Create product (admin only)&lt;br&gt;
Get all products (public)&lt;br&gt;
Get single product&lt;br&gt;
Update product (admin only)&lt;br&gt;
Delete product (admin only)&lt;br&gt;
🧾 Orders&lt;br&gt;
Create order (user)&lt;br&gt;
View own orders&lt;br&gt;
Admin sees all orders&lt;br&gt;
🔑 Core Learning Flow (build in this order)&lt;br&gt;
STEP 1 — Setup&lt;br&gt;
pip install fastapi uvicorn sqlalchemy passlib python-jose&lt;br&gt;
STEP 2 — Run FastAPI&lt;/p&gt;

&lt;h1&gt;
  
  
  app/main.py
&lt;/h1&gt;

&lt;p&gt;from fastapi import FastAPI&lt;/p&gt;

&lt;p&gt;app = FastAPI()&lt;/p&gt;

&lt;p&gt;@app.get("/")&lt;br&gt;
def root():&lt;br&gt;
    return {"message": "API is running"}&lt;/p&gt;

&lt;p&gt;Run:&lt;/p&gt;

&lt;p&gt;uvicorn app.main:app --reload&lt;br&gt;
STEP 3 — Add Database&lt;/p&gt;

&lt;p&gt;Create SQLAlchemy models first (User, Product, Order)&lt;/p&gt;

&lt;p&gt;STEP 4 — Auth (MOST IMPORTANT)&lt;br&gt;
Register endpoint&lt;br&gt;
Login endpoint&lt;br&gt;
JWT token creation&lt;br&gt;
Middleware to protect routes&lt;br&gt;
STEP 5 — Products CRUD&lt;/p&gt;

&lt;p&gt;Build full CRUD using:&lt;/p&gt;

&lt;p&gt;routes&lt;br&gt;
services layer (important for clean code)&lt;br&gt;
STEP 6 — Orders System&lt;br&gt;
User creates order from product&lt;br&gt;
Reduce stock&lt;br&gt;
Save order history&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🚀 I Built a Netflix-Style AWS Learning App (V2) — Because Memorizing Isn’t Enough</title>
      <dc:creator>David Kljajo</dc:creator>
      <pubDate>Mon, 30 Mar 2026 11:24:21 +0000</pubDate>
      <link>https://dev.to/davidkljajo/-i-built-a-netflix-style-aws-learning-app-v2-because-memorizing-isnt-enough-2lnk</link>
      <guid>https://dev.to/davidkljajo/-i-built-a-netflix-style-aws-learning-app-v2-because-memorizing-isnt-enough-2lnk</guid>
      <description>&lt;p&gt;Most people prepare for the AWS Solutions Architect Associate (SAA) exam the same way:&lt;/p&gt;

&lt;p&gt;They grind hundreds of practice questions.&lt;/p&gt;

&lt;p&gt;I did that too.&lt;br&gt;
And somewhere along the way, I realized something important:&lt;/p&gt;

&lt;p&gt;👉 You don’t fail because you don’t know AWS services&lt;br&gt;
👉 You fail because you don’t think like an architect&lt;/p&gt;

&lt;p&gt;That realization changed everything.&lt;/p&gt;




&lt;p&gt;📸 &lt;em&gt;A Netflix-style AWS learning experience&lt;/em&gt;&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fdpmxeov57aizb0nmrxfe.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.amazonaws.com%2Fuploads%2Farticles%2Fdpmxeov57aizb0nmrxfe.png" alt=" " width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 The Problem With Traditional Prep
&lt;/h2&gt;

&lt;p&gt;Most SAA prep tools focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;memorizing service features&lt;/li&gt;
&lt;li&gt;recognizing patterns in questions&lt;/li&gt;
&lt;li&gt;eliminating wrong answers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That works… to a point.&lt;/p&gt;

&lt;p&gt;But the real exam doesn’t test memory. It tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;decision-making under constraints&lt;/li&gt;
&lt;li&gt;understanding trade-offs&lt;/li&gt;
&lt;li&gt;choosing the &lt;em&gt;best&lt;/em&gt; solution, not just a correct one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s where most people struggle.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎬 So I Built Something Different
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;AWS SAA AI Coach — V2&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Instead of another quiz app, I built a &lt;strong&gt;Netflix-style learning experience&lt;/strong&gt; that trains how you think — not just what you know.&lt;/p&gt;

&lt;p&gt;The idea was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if learning AWS felt like watching a series…&lt;br&gt;
where each “episode” builds your architectural thinking?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧠 How It Works
&lt;/h2&gt;

&lt;p&gt;You choose your path:&lt;/p&gt;

&lt;h3&gt;
  
  
  📺 Learning Series
&lt;/h3&gt;

&lt;p&gt;Learn like episodes — simple, structured, guided.&lt;/p&gt;

&lt;h3&gt;
  
  
  📈 Beginner → Advanced
&lt;/h3&gt;

&lt;p&gt;Gradually move into real architectural challenges.&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Exam Mode
&lt;/h3&gt;

&lt;p&gt;A full SAA-style simulation experience.&lt;/p&gt;




&lt;p&gt;Then you pick a topic (or go &lt;strong&gt;“Mixed”&lt;/strong&gt;, just like the real exam), and the app gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a realistic AWS scenario&lt;/li&gt;
&lt;li&gt;four possible answers (A / B / C / D)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📸 &lt;em&gt;A realistic AWS scenario with multiple-choice decisions&lt;/em&gt;&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fdaw4jnmwpv103ioj5uaj.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.amazonaws.com%2Fuploads%2Farticles%2Fdaw4jnmwpv103ioj5uaj.png" alt=" " width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Once you answer, you instantly get:&lt;/p&gt;

&lt;p&gt;✔ whether you’re correct or not&lt;br&gt;
📖 a concise explanation&lt;br&gt;
⚖️ the trade-offs (cost, scalability, reliability)&lt;br&gt;
🎯 the key takeaway&lt;/p&gt;

&lt;p&gt;📸 &lt;em&gt;Instant feedback with explanations and architectural trade-offs&lt;/em&gt;&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fhhskeqoci0vs4w0j4der.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.amazonaws.com%2Fuploads%2Farticles%2Fhhskeqoci0vs4w0j4der.png" alt=" " width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 What Makes It Different
&lt;/h2&gt;

&lt;p&gt;This is &lt;strong&gt;not&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a quiz generator&lt;/li&gt;
&lt;li&gt;a memorization tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is about &lt;strong&gt;thinking like an architect&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every question:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uses multiple AWS services&lt;/li&gt;
&lt;li&gt;reflects real-world business scenarios&lt;/li&gt;
&lt;li&gt;includes realistic distractors (just like the exam)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ What’s New in V2
&lt;/h2&gt;

&lt;p&gt;I rebuilt a lot based on feedback and my own learning experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎬 &lt;strong&gt;Learning Series&lt;/strong&gt; — Netflix-style structured teaching&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Scenario-first design&lt;/strong&gt; — closer to the real exam&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Faster, punchier explanations&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Cleaner UX&lt;/strong&gt; — click → answer → feedback&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 Example of the Mindset Shift
&lt;/h2&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What does S3 do?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The app pushes you to think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Given cost constraints, high availability, and unpredictable traffic —&lt;br&gt;
what’s the &lt;em&gt;best&lt;/em&gt; architecture using S3, CloudFront, and maybe Lambda?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s the real skill the exam is testing.&lt;/p&gt;




&lt;h2&gt;
  
  
  💭 Why I Built This
&lt;/h2&gt;

&lt;p&gt;Because AWS SAA is not about knowing services.&lt;/p&gt;

&lt;p&gt;It’s about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;making trade-offs&lt;/li&gt;
&lt;li&gt;choosing the best possible solution&lt;/li&gt;
&lt;li&gt;thinking in systems and architectures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I couldn’t find a tool that truly trains that — so I built one.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎥 Demo
&lt;/h2&gt;

&lt;p&gt;Here’s a quick demo of the app:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/JCqOgLgkwR0" rel="noopener noreferrer"&gt;https://youtu.be/JCqOgLgkwR0&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🙌 I’d Love Your Feedback
&lt;/h2&gt;

&lt;p&gt;If you’re preparing for SAA — or already certified — I’m really curious:&lt;/p&gt;

&lt;p&gt;👉 What was the hardest part of the exam for you?&lt;br&gt;
👉 Was it specific services… or decision-making?&lt;/p&gt;

&lt;p&gt;Also happy to share more about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how I design the scenarios&lt;/li&gt;
&lt;li&gt;how the AI generates explanations&lt;/li&gt;
&lt;li&gt;what I’d improve in V3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to see the original discussion and comments:&lt;/p&gt;

&lt;h2&gt;
  
  
  👉 &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7444140894670290944/" rel="noopener noreferrer"&gt;https://www.linkedin.com/feed/update/urn:li:activity:7444140894670290944/&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Thanks for reading 🙏&lt;/p&gt;

</description>
      <category>aws</category>
      <category>webdev</category>
      <category>cloudcomputing</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Built a Netflix-Style AI App to Study AWS (And It Actually Works)</title>
      <dc:creator>David Kljajo</dc:creator>
      <pubDate>Fri, 27 Mar 2026 23:30:52 +0000</pubDate>
      <link>https://dev.to/davidkljajo/i-built-a-netflix-style-ai-aws-saa-coach-using-partyrock-14cf</link>
      <guid>https://dev.to/davidkljajo/i-built-a-netflix-style-ai-aws-saa-coach-using-partyrock-14cf</guid>
      <description>&lt;p&gt;Studying for the AWS Solutions Architect Associate exam felt… repetitive.&lt;/p&gt;

&lt;p&gt;I was going through practice tests, selecting answers, checking results — but something was missing.&lt;/p&gt;

&lt;p&gt;I wasn’t actually learning.&lt;/p&gt;

&lt;p&gt;Most platforms tell you if you’re right or wrong, but they don’t really help you understand why. And after a while, it just becomes passive memorization.&lt;/p&gt;

&lt;p&gt;So I thought:&lt;/p&gt;

&lt;p&gt;What if learning AWS felt more like Netflix… and less like a textbook?&lt;/p&gt;

&lt;p&gt;🧠 The Idea&lt;/p&gt;

&lt;p&gt;Instead of static quizzes, I wanted something interactive.&lt;/p&gt;

&lt;p&gt;Something where:&lt;/p&gt;

&lt;p&gt;each question feels like a small “episode”&lt;br&gt;
you pause and think before answering&lt;br&gt;
and then get a clear explanation, like a post-scene breakdown&lt;/p&gt;

&lt;p&gt;That’s when I decided to build a simple AI-powered learning app using AWS PartyRock.&lt;/p&gt;

&lt;p&gt;⚙️ What I Built&lt;/p&gt;

&lt;p&gt;I created a Netflix-style AI AWS SAA Coach that:&lt;/p&gt;

&lt;p&gt;Generates AWS exam-style questions&lt;br&gt;
Supports beginner and intermediate levels&lt;br&gt;
Lets you answer in a real exam-like flow&lt;br&gt;
Gives instant explanations after each answer&lt;br&gt;
Helps you learn from mistakes instead of just scoring&lt;/p&gt;

&lt;p&gt;The goal was simple:&lt;br&gt;
👉 turn passive studying into active learning&lt;/p&gt;

&lt;p&gt;🎥 Demo&lt;/p&gt;

&lt;p&gt;I recorded a short walkthrough showing how it works in practice:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://www.youtube.com/watch?v=cMg6FF2ZbmQ" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=cMg6FF2ZbmQ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📸 How It Looks&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fvmfzqayzvj6wrdi6yirc.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.amazonaws.com%2Fuploads%2Farticles%2Fvmfzqayzvj6wrdi6yirc.png" alt=" " width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fyw2gw4f9dldhiqzj70mn.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.amazonaws.com%2Fuploads%2Farticles%2Fyw2gw4f9dldhiqzj70mn.png" alt=" " width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fq0qna2w7gul0z4kcdhtq.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.amazonaws.com%2Fuploads%2Farticles%2Fq0qna2w7gul0z4kcdhtq.png" alt=" " width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fx0jhrile27rla40xzehx.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.amazonaws.com%2Fuploads%2Farticles%2Fx0jhrile27rla40xzehx.png" alt=" " width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fifb6tueh0yxlam9czpoq.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.amazonaws.com%2Fuploads%2Farticles%2Fifb6tueh0yxlam9czpoq.png" alt=" " width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡 What I Learned Building This&lt;/p&gt;

&lt;p&gt;This project made me realize something important:&lt;/p&gt;

&lt;p&gt;Learning cloud concepts isn’t just about information — it’s about interaction.&lt;/p&gt;

&lt;p&gt;When you:&lt;/p&gt;

&lt;p&gt;think before answering&lt;br&gt;
see immediate feedback&lt;br&gt;
understand mistakes&lt;/p&gt;

&lt;p&gt;You remember things much better.&lt;/p&gt;

&lt;p&gt;🚧 It’s Still a Beta&lt;/p&gt;

&lt;p&gt;Right now, the app focuses on:&lt;/p&gt;

&lt;p&gt;beginner&lt;br&gt;
intermediate questions&lt;/p&gt;

&lt;p&gt;But after sharing it and getting feedback, one thing became clear:&lt;/p&gt;

&lt;p&gt;👉 The AWS SAA exam is heavily based on real-world, multi-service scenarios&lt;/p&gt;

&lt;p&gt;So the next step is to expand this into:&lt;/p&gt;

&lt;p&gt;advanced-level questions&lt;br&gt;
scenario-based challenges&lt;br&gt;
multiple AWS services combined (VPC + S3 + Lambda, etc.)&lt;/p&gt;

&lt;p&gt;Basically:&lt;/p&gt;

&lt;p&gt;more real exam-style thinking&lt;/p&gt;

&lt;p&gt;🚀 What’s Next&lt;/p&gt;

&lt;p&gt;I want to evolve this into something that:&lt;/p&gt;

&lt;p&gt;simulates real AWS exam scenarios&lt;br&gt;
adapts to your weak areas&lt;br&gt;
and keeps the “interactive learning” feel&lt;br&gt;
🙌 Would Love Your Feedback&lt;/p&gt;

&lt;p&gt;This started as a small experiment, but I think the idea has potential.&lt;/p&gt;

&lt;p&gt;If you’re preparing for AWS SAA or working with AWS:&lt;/p&gt;

&lt;p&gt;👉 What topics or scenarios did you find most challenging?&lt;/p&gt;

&lt;p&gt;🍿 Final Thought&lt;/p&gt;

&lt;p&gt;What if learning complex topics didn’t feel like studying…&lt;/p&gt;

&lt;p&gt;…but more like watching and interacting with a series?&lt;/p&gt;

&lt;p&gt;Full project: [&lt;a href="https://github.com/dkljajo/aws-saa-ai-coach-partyrock" rel="noopener noreferrer"&gt;https://github.com/dkljajo/aws-saa-ai-coach-partyrock&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>webdev</category>
      <category>learning</category>
    </item>
    <item>
      <title>Building My First Generative AI Journey with Kiro</title>
      <dc:creator>David Kljajo</dc:creator>
      <pubDate>Sun, 22 Mar 2026 00:49:55 +0000</pubDate>
      <link>https://dev.to/davidkljajo/building-my-first-generative-ai-journey-with-kiro-44h2</link>
      <guid>https://dev.to/davidkljajo/building-my-first-generative-ai-journey-with-kiro-44h2</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://builder.aws.com" rel="noopener noreferrer"&gt;Builder AWS&lt;/a&gt; by David Kljajo&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I explored Generative AI by building real projects instead of just reading tutorials. Using &lt;strong&gt;Kiro&lt;/strong&gt;, I experimented, iterated, and learned how to turn ideas into interactive outputs. This story shares my process, lessons learned, and my personal journey with screenshots along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 My Builder Journey into Generative AI
&lt;/h2&gt;

&lt;p&gt;I didn’t start with a clear plan — I just knew I wanted to understand how Generative AI actually works beyond the hype.&lt;/p&gt;

&lt;p&gt;At first, things were confusing. There were too many tools, too many tutorials, and a lot of theory that didn’t translate into real skills. Instead of trying to learn everything, I focused on building something small and practical. That’s when I started using &lt;strong&gt;Kiro&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ What I Built
&lt;/h3&gt;

&lt;p&gt;Using Kiro, I explored how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask better prompts&lt;/li&gt;
&lt;li&gt;Structure ideas into usable outputs&lt;/li&gt;
&lt;li&gt;Turn concepts into something interactive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I experimented with different approaches, tested what worked, and improved step by step. It wasn’t perfect, but it was real progress.&lt;/p&gt;

&lt;h3&gt;
  
  
  📸 My Process (Screenshots)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&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.amazonaws.com%2Fuploads%2Farticles%2F31snl1k61553lrxbsub3.png" alt=" " width="800" height="407"&gt;
&lt;/li&gt;
&lt;li&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.amazonaws.com%2Fuploads%2Farticles%2Fvpcvpwyir45l9ee54ta6.png" alt=" " width="800" height="407"&gt; &lt;/li&gt;
&lt;li&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.amazonaws.com%2Fuploads%2Farticles%2F0kavdbxrso3gsxr6tn37.png" alt=" " width="800" height="372"&gt;
&lt;/li&gt;
&lt;li&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.amazonaws.com%2Fuploads%2Farticles%2Fiy63fu53w8l53oj7v7zh.png" alt=" " width="800" height="372"&gt; &lt;/li&gt;
&lt;li&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.amazonaws.com%2Fuploads%2Farticles%2F8ubewct7tkjvb9di1icr.png" alt=" " width="800" height="372"&gt; &lt;/li&gt;
&lt;li&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.amazonaws.com%2Fuploads%2Farticles%2Fp75nnd1qnz6rsrzua8r4.png" alt=" " width="800" height="372"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🧠 Questions I Asked Kiro
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Kiro Answer 1 (Career-Focused)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Question:&lt;/strong&gt; What is the most practical GenAI certification path in 2026 if I want to build real-world projects and not just pass exams?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Answer from Kiro:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Foundations (free): DeepLearning.AI, LangChain Academy
&lt;/li&gt;
&lt;li&gt;Pick 1 Cloud Cert: AWS AI Practitioner, Google GenAI Engineer, or Azure AI-102
&lt;/li&gt;
&lt;li&gt;3 Real Projects:

&lt;ul&gt;
&lt;li&gt;RAG chatbot
&lt;/li&gt;
&lt;li&gt;AI agent with tools
&lt;/li&gt;
&lt;li&gt;Full-stack AI product
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Showcase: GitHub + live demos — projects &amp;gt; certs
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kiro Answer 2 (Learning + Strategy)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Question:&lt;/strong&gt; Design a step-by-step roadmap to become certified in Generative AI, including free resources, hands-on projects, and how to stand out to employers.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Answer from Kiro:&lt;/strong&gt;  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 1-2:&lt;/strong&gt; Learn AI basics &amp;amp; GenAI landscape
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 3-6:&lt;/strong&gt; Core stack: Python, LangChain, OpenAI API
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 5-8:&lt;/strong&gt; Build RAG chatbot
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 8-14:&lt;/strong&gt; Pass cloud cert
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 12-20:&lt;/strong&gt; Build AI agent + full-stack AI product
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ongoing:&lt;/strong&gt; Post projects, contribute to open source, polish GitHub &amp;amp; LinkedIn
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🧩 The Core Philosophy
&lt;/h3&gt;

&lt;p&gt;Certifications alone won't get you hired or make you effective. The winning combo is: &lt;strong&gt;free/cheap foundational certs + cloud cert for credibility + a portfolio of 3 deployed projects.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Phase 1 — Foundation (1-2 months, mostly free)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DeepLearning.AI short courses&lt;/strong&gt; — prompt engineering, LangChain, RAG, agents. Free, practical, 1-2 hours each
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LangChain Academy&lt;/strong&gt; — free, hands-on agent building
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast.ai Practical Deep Learning&lt;/strong&gt; — model-level understanding
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools to get comfortable with:&lt;/strong&gt; Python, LangChain/LangGraph, OpenAI/Anthropic APIs, vector DBs (Chroma, Pinecone, Weaviate), HuggingFace
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 2 — One Cloud Cert (pick based on your target job)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;Cert&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS shops&lt;/td&gt;
&lt;td&gt;AWS AI Practitioner → AWS ML Specialty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google/GCP&lt;/td&gt;
&lt;td&gt;Google Cloud GenAI Engineer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft/enterprise&lt;/td&gt;
&lt;td&gt;Azure AI Engineer Associate (AI-102)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor-neutral&lt;/td&gt;
&lt;td&gt;IBM AI Engineering Professional (Coursera)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Phase 3 — The 3 Portfolio Projects That Actually Matter
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RAG chatbot&lt;/strong&gt; — ingest PDFs/docs, answer questions, deploy using LangChain + Chroma + frontend (Streamlit/FastAPI)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI agent with tools&lt;/strong&gt; — searches web, runs code, calls APIs (LangGraph/CrewAI)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full-stack AI product&lt;/strong&gt; — real use case, auth, deployed URL (AI assistant, code reviewer, domain Q&amp;amp;A)
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each project should have a GitHub repo, live demo, and write-up.&lt;/p&gt;




&lt;h3&gt;
  
  
  What to Skip
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Generic "AI for everyone" certs with no coding
&lt;/li&gt;
&lt;li&gt;Paying for bootcamps before trying free resources
&lt;/li&gt;
&lt;li&gt;Chasing every framework — pick one (LangChain or LlamaIndex) and go deep
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Realistic Timeline
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Months&lt;/th&gt;
&lt;th&gt;Focus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1-2&lt;/td&gt;
&lt;td&gt;DeepLearning.AI courses + first RAG project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3-4&lt;/td&gt;
&lt;td&gt;Cloud cert prep + agent project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5-6&lt;/td&gt;
&lt;td&gt;Full-stack project + polish portfolio + apply&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Stage-by-Stage Guide
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Stage 1 — Get Your Bearings (Weeks 1-2, free)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3Blue1Brown Neural Networks series
&lt;/li&gt;
&lt;li&gt;DeepLearning.AI: Generative AI for Everyone
&lt;/li&gt;
&lt;li&gt;Read: “Attention Is All You Need” abstract + plain-English explainer
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stage 2 — Learn the Core Stack (Weeks 3-6, free)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DeepLearning.AI short courses
&lt;/li&gt;
&lt;li&gt;LangChain Academy — Introduction to LangGraph
&lt;/li&gt;
&lt;li&gt;HuggingFace free courses — NLP + Agents
&lt;/li&gt;
&lt;li&gt;Tools: Python, LangChain, OpenAI/Anthropic SDK, Chroma/FAISS, Streamlit, FastAPI, Docker basics
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stage 3 — First Real Project (Weeks 5-8)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build a RAG chatbot with minimal stack: LangChain + Chroma + OpenAI API + Streamlit + deployed (Railway/Render free tier). Push to GitHub with README.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stage 4 — Pick One Cloud Cert (Weeks 8-14)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS-heavy companies → AWS Certified AI Practitioner → ML Specialty
&lt;/li&gt;
&lt;li&gt;Google/GCP roles → Google Cloud GenAI Engineer
&lt;/li&gt;
&lt;li&gt;Enterprise/Microsoft → Azure AI Engineer Associate (AI-102)
&lt;/li&gt;
&lt;li&gt;Vendor-neutral → IBM AI Engineering Professional (Coursera)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stage 5 — Build Remaining Portfolio Projects (Weeks 12-20)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project 2 — AI Agent with Tools (multi-step tasks, research agent, uses LangGraph/CrewAI)
&lt;/li&gt;
&lt;li&gt;Project 3 — Full-stack AI Product (real use case, auth, live URL, FastAPI + React/Next.js + Supabase + Vercel/Railway)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stage 6 — Stand Out to Employers (Ongoing)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LinkedIn posts, dev.to/Hashnode articles for projects
&lt;/li&gt;
&lt;li&gt;GitHub: pinned repos, clean READMEs, live demos
&lt;/li&gt;
&lt;li&gt;Open source contributions
&lt;/li&gt;
&lt;li&gt;Resume: projects &amp;gt; certifications, quantify impact
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Certs get you past ATS filters; your portfolio gets the interview; your ability to explain projects gets the offer.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://builder.aws.com" rel="noopener noreferrer"&gt;Builder AWS&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>generativeai</category>
      <category>aws</category>
      <category>machinelearning</category>
      <category>career</category>
    </item>
    <item>
      <title>Building My First Generative AI Journey with Kiro</title>
      <dc:creator>David Kljajo</dc:creator>
      <pubDate>Sun, 22 Mar 2026 00:49:55 +0000</pubDate>
      <link>https://dev.to/davidkljajo/building-my-first-generative-ai-journey-with-kiro-1276</link>
      <guid>https://dev.to/davidkljajo/building-my-first-generative-ai-journey-with-kiro-1276</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://builder.aws.com" rel="noopener noreferrer"&gt;Builder AWS&lt;/a&gt; by David Kljajo&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I explored Generative AI by building real projects instead of just reading tutorials. Using &lt;strong&gt;Kiro&lt;/strong&gt;, I experimented, iterated, and learned how to turn ideas into interactive outputs. This story shares my process, lessons learned, and my personal journey with screenshots along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 My Builder Journey into Generative AI
&lt;/h2&gt;

&lt;p&gt;I didn’t start with a clear plan — I just knew I wanted to understand how Generative AI actually works beyond the hype.&lt;/p&gt;

&lt;p&gt;At first, things were confusing. There were too many tools, too many tutorials, and a lot of theory that didn’t translate into real skills. Instead of trying to learn everything, I focused on building something small and practical. That’s when I started using &lt;strong&gt;Kiro&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ What I Built
&lt;/h3&gt;

&lt;p&gt;Using Kiro, I explored how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask better prompts&lt;/li&gt;
&lt;li&gt;Structure ideas into usable outputs&lt;/li&gt;
&lt;li&gt;Turn concepts into something interactive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I experimented with different approaches, tested what worked, and improved step by step. It wasn’t perfect, but it was real progress.&lt;/p&gt;

&lt;h3&gt;
  
  
  📸 My Process (Screenshots)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&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.amazonaws.com%2Fuploads%2Farticles%2F31snl1k61553lrxbsub3.png" alt=" " width="800" height="407"&gt;
&lt;/li&gt;
&lt;li&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.amazonaws.com%2Fuploads%2Farticles%2Fvpcvpwyir45l9ee54ta6.png" alt=" " width="800" height="407"&gt; &lt;/li&gt;
&lt;li&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.amazonaws.com%2Fuploads%2Farticles%2F0kavdbxrso3gsxr6tn37.png" alt=" " width="800" height="372"&gt;
&lt;/li&gt;
&lt;li&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.amazonaws.com%2Fuploads%2Farticles%2Fiy63fu53w8l53oj7v7zh.png" alt=" " width="800" height="372"&gt; &lt;/li&gt;
&lt;li&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.amazonaws.com%2Fuploads%2Farticles%2F8ubewct7tkjvb9di1icr.png" alt=" " width="800" height="372"&gt; &lt;/li&gt;
&lt;li&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.amazonaws.com%2Fuploads%2Farticles%2Fp75nnd1qnz6rsrzua8r4.png" alt=" " width="800" height="372"&gt;
&lt;/li&gt;
&lt;li&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🧠 Questions I Asked Kiro
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Kiro Answer 1 (Career-Focused)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Question:&lt;/strong&gt; What is the most practical GenAI certification path in 2026 if I want to build real-world projects and not just pass exams?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Answer from Kiro:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Foundations (free): DeepLearning.AI, LangChain Academy
&lt;/li&gt;
&lt;li&gt;Pick 1 Cloud Cert: AWS AI Practitioner, Google GenAI Engineer, or Azure AI-102
&lt;/li&gt;
&lt;li&gt;3 Real Projects:

&lt;ul&gt;
&lt;li&gt;RAG chatbot
&lt;/li&gt;
&lt;li&gt;AI agent with tools
&lt;/li&gt;
&lt;li&gt;Full-stack AI product
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Showcase: GitHub + live demos — projects &amp;gt; certs
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kiro Answer 2 (Learning + Strategy)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Question:&lt;/strong&gt; Design a step-by-step roadmap to become certified in Generative AI, including free resources, hands-on projects, and how to stand out to employers.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Answer from Kiro:&lt;/strong&gt;  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 1-2:&lt;/strong&gt; Learn AI basics &amp;amp; GenAI landscape
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 3-6:&lt;/strong&gt; Core stack: Python, LangChain, OpenAI API
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 5-8:&lt;/strong&gt; Build RAG chatbot
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 8-14:&lt;/strong&gt; Pass cloud cert
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weeks 12-20:&lt;/strong&gt; Build AI agent + full-stack AI product
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ongoing:&lt;/strong&gt; Post projects, contribute to open source, polish GitHub &amp;amp; LinkedIn
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🧩 The Core Philosophy
&lt;/h3&gt;

&lt;p&gt;Certifications alone won't get you hired or make you effective. The winning combo is: &lt;strong&gt;free/cheap foundational certs + cloud cert for credibility + a portfolio of 3 deployed projects.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Phase 1 — Foundation (1-2 months, mostly free)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DeepLearning.AI short courses&lt;/strong&gt; — prompt engineering, LangChain, RAG, agents. Free, practical, 1-2 hours each
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LangChain Academy&lt;/strong&gt; — free, hands-on agent building
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast.ai Practical Deep Learning&lt;/strong&gt; — model-level understanding
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools to get comfortable with:&lt;/strong&gt; Python, LangChain/LangGraph, OpenAI/Anthropic APIs, vector DBs (Chroma, Pinecone, Weaviate), HuggingFace
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 2 — One Cloud Cert (pick based on your target job)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;Cert&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS shops&lt;/td&gt;
&lt;td&gt;AWS AI Practitioner → AWS ML Specialty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google/GCP&lt;/td&gt;
&lt;td&gt;Google Cloud GenAI Engineer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft/enterprise&lt;/td&gt;
&lt;td&gt;Azure AI Engineer Associate (AI-102)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor-neutral&lt;/td&gt;
&lt;td&gt;IBM AI Engineering Professional (Coursera)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Phase 3 — The 3 Portfolio Projects That Actually Matter
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RAG chatbot&lt;/strong&gt; — ingest PDFs/docs, answer questions, deploy using LangChain + Chroma + frontend (Streamlit/FastAPI)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI agent with tools&lt;/strong&gt; — searches web, runs code, calls APIs (LangGraph/CrewAI)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full-stack AI product&lt;/strong&gt; — real use case, auth, deployed URL (AI assistant, code reviewer, domain Q&amp;amp;A)
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each project should have a GitHub repo, live demo, and write-up.&lt;/p&gt;




&lt;h3&gt;
  
  
  What to Skip
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Generic "AI for everyone" certs with no coding
&lt;/li&gt;
&lt;li&gt;Paying for bootcamps before trying free resources
&lt;/li&gt;
&lt;li&gt;Chasing every framework — pick one (LangChain or LlamaIndex) and go deep
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Realistic Timeline
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Months&lt;/th&gt;
&lt;th&gt;Focus&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1-2&lt;/td&gt;
&lt;td&gt;DeepLearning.AI courses + first RAG project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3-4&lt;/td&gt;
&lt;td&gt;Cloud cert prep + agent project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5-6&lt;/td&gt;
&lt;td&gt;Full-stack project + polish portfolio + apply&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Stage-by-Stage Guide
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Stage 1 — Get Your Bearings (Weeks 1-2, free)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3Blue1Brown Neural Networks series
&lt;/li&gt;
&lt;li&gt;DeepLearning.AI: Generative AI for Everyone
&lt;/li&gt;
&lt;li&gt;Read: “Attention Is All You Need” abstract + plain-English explainer
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stage 2 — Learn the Core Stack (Weeks 3-6, free)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DeepLearning.AI short courses
&lt;/li&gt;
&lt;li&gt;LangChain Academy — Introduction to LangGraph
&lt;/li&gt;
&lt;li&gt;HuggingFace free courses — NLP + Agents
&lt;/li&gt;
&lt;li&gt;Tools: Python, LangChain, OpenAI/Anthropic SDK, Chroma/FAISS, Streamlit, FastAPI, Docker basics
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stage 3 — First Real Project (Weeks 5-8)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build a RAG chatbot with minimal stack: LangChain + Chroma + OpenAI API + Streamlit + deployed (Railway/Render free tier). Push to GitHub with README.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stage 4 — Pick One Cloud Cert (Weeks 8-14)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS-heavy companies → AWS Certified AI Practitioner → ML Specialty
&lt;/li&gt;
&lt;li&gt;Google/GCP roles → Google Cloud GenAI Engineer
&lt;/li&gt;
&lt;li&gt;Enterprise/Microsoft → Azure AI Engineer Associate (AI-102)
&lt;/li&gt;
&lt;li&gt;Vendor-neutral → IBM AI Engineering Professional (Coursera)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stage 5 — Build Remaining Portfolio Projects (Weeks 12-20)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project 2 — AI Agent with Tools (multi-step tasks, research agent, uses LangGraph/CrewAI)
&lt;/li&gt;
&lt;li&gt;Project 3 — Full-stack AI Product (real use case, auth, live URL, FastAPI + React/Next.js + Supabase + Vercel/Railway)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stage 6 — Stand Out to Employers (Ongoing)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LinkedIn posts, dev.to/Hashnode articles for projects
&lt;/li&gt;
&lt;li&gt;GitHub: pinned repos, clean READMEs, live demos
&lt;/li&gt;
&lt;li&gt;Open source contributions
&lt;/li&gt;
&lt;li&gt;Resume: projects &amp;gt; certifications, quantify impact
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Certs get you past ATS filters; your portfolio gets the interview; your ability to explain projects gets the offer.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://builder.aws.com" rel="noopener noreferrer"&gt;Builder AWS&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>generativeai</category>
      <category>aws</category>
      <category>machinelearning</category>
      <category>career</category>
    </item>
  </channel>
</rss>
