<?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: Eric Rodríguez</title>
    <description>The latest articles on DEV Community by Eric Rodríguez (@ericrodriguez10).</description>
    <link>https://dev.to/ericrodriguez10</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3677578%2Fcebf54ee-c6c0-436d-8570-7412b62d4321.jpeg</url>
      <title>DEV Community: Eric Rodríguez</title>
      <link>https://dev.to/ericrodriguez10</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ericrodriguez10"/>
    <language>en</language>
    <item>
      <title>Day 78: Hunting Silent IAM Bugs &amp; Securing DynamoDB</title>
      <dc:creator>Eric Rodríguez</dc:creator>
      <pubDate>Sat, 09 May 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/ericrodriguez10/day-78-hunting-silent-iam-bugs-securing-dynamodb-4m1b</link>
      <guid>https://dev.to/ericrodriguez10/day-78-hunting-silent-iam-bugs-securing-dynamodb-4m1b</guid>
      <description>&lt;h1&gt;
  
  
  aws #serverless #react #webdev
&lt;/h1&gt;

&lt;p&gt;published: true&lt;br&gt;
date: "2026-05-08 21:30:00 UTC"&lt;br&gt;
Today was one of those days where the code was technically correct, but the infrastructure said "No." I had to dive deep into AWS CloudWatch to fix a cascading series of silent failures in my AI Financial Agent.&lt;/p&gt;

&lt;p&gt;Here is the breakdown of today's architecture fixes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The Silent IAM Policy Trap&lt;br&gt;
I built a full account annihilation flow. The user clicks "Delete," and Lambda is supposed to wipe their DynamoDB history and Cognito identity. But it didn't work. The API returned a success status, but the data remained.&lt;br&gt;
Checking CloudWatch revealed an AccessDeniedException. My Lambda role lacked the dynamodb:BatchWriteItem and cognito-idp:AdminDeleteUser permissions. In serverless, if your IAM policies are strictly scoped (as they should be), you must account for every single AWS SDK method you call. I updated the inline policies, and the nuclear button finally worked.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DynamoDB Deletion Protection&lt;br&gt;
While running manual boto3 cleanup scripts to fix the IAM mess, I realized a single typo in my Table() definition could wipe my production database. To fix this, I enabled Deletion Protection on my FinanceAgent-Transactions table. It's a simple toggle in the AWS Console that makes it impossible to delete the table without explicitly disabling the protection first. A 30-second fix for ultimate peace of mind.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React Data Hydration Flash&lt;br&gt;
On the frontend, my UI had an annoying flash when loading the user's avatar. I was trying to be clever with Tailwind opacity-0 transitions and onLoad events. I ripped that out. By relying purely on localStorage caching and removing artificial CSS delays, the avatar now renders instantly on mount.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Context-Aware AWS SES Emails&lt;br&gt;
My backend was lazily recycling the "Daily Report" HTML template for new users, resulting in welcome emails that said "Yesterday's Expenses: 0.00". I refactored email_engine.py to include a dedicated, structurally clean generate_welcome_email() function, and tied it to a strict welcome_email_sent flag in DynamoDB to guarantee it only fires once per user.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Infrastructure is messy, but today the system is drastically more resilient.&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%2F56wc1k73u9xwvcy5o0d3.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%2F56wc1k73u9xwvcy5o0d3.png" alt=" " width="800" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Day 77: Fixing React Hydration &amp; AWS SES Identities</title>
      <dc:creator>Eric Rodríguez</dc:creator>
      <pubDate>Fri, 08 May 2026 16:00:00 +0000</pubDate>
      <link>https://dev.to/ericrodriguez10/day-77-fixing-react-hydration-aws-ses-identities-fk9</link>
      <guid>https://dev.to/ericrodriguez10/day-77-fixing-react-hydration-aws-ses-identities-fk9</guid>
      <description>&lt;p&gt;Sometimes you architect a robust Serverless backend only to realize your frontend feels clunky and your automated emails look like spam. Today, I fixed two glaring UI/UX issues in my AI Financial Agent.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The React Avatar Flash
I had a classic Data Hydration issue. When a user logged in, React synchronously rendered a default avatar, waited 200ms for DynamoDB to return the real profile picture URL, and then aggressively snapped the new image into place.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fix? Stop rendering placeholders if you are in a loading state. I modified my React component to leave the avatar space as a clean white circle (!isAvatarLoading &amp;amp;&amp;amp; ) while the network request resolves. Paired with localStorage caching, returning users get instant loads, and new users get a clean experience without jarring layout shifts.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Robot Email in AWS SES
My Python Lambda was sending daily reports via SES using Source="&lt;a href="mailto:ai@duromoney.com"&gt;ai@duromoney.com&lt;/a&gt;". While technically correct, it looked completely untrustworthy in an inbox.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By changing the Boto3 payload to Source="DuroAI &lt;a href="mailto:ai@duromoney.com"&gt;ai@duromoney.com&lt;/a&gt;", Gmail and Outlook now display "DuroAI" as the sender name. I also used this opportunity to wire up an Event-Driven Welcome Email. The moment a user's profile is saved for the first time in DynamoDB, the Lambda router intercepts the payload and triggers a custom SES welcome template.&lt;/p&gt;

&lt;p&gt;Code for functionality, but architect for trust!&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%2Fqyd59jh92e5462t67dem.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%2Fqyd59jh92e5462t67dem.png" alt=" " width="800" height="696"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>aws</category>
      <category>serverless</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Day 76: Supercharging my React App with AWS CloudFront CDN</title>
      <dc:creator>Eric Rodríguez</dc:creator>
      <pubDate>Thu, 07 May 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/ericrodriguez10/day-76-supercharging-my-react-app-with-aws-cloudfront-cdn-jgk</link>
      <guid>https://dev.to/ericrodriguez10/day-76-supercharging-my-react-app-with-aws-cloudfront-cdn-jgk</guid>
      <description>&lt;p&gt;Today I tackled one of the most common UI annoyances: slow-loading profile pictures.&lt;/p&gt;

&lt;p&gt;My serverless financial app uses AWS S3 to store user avatars. It works perfectly, but S3 object URLs can be slow to resolve depending on where the user is physically located.&lt;/p&gt;

&lt;p&gt;(The Upgrade: Amazon CloudFront)&lt;br&gt;
To fix this, I put a CDN in front of my bucket. I created a CloudFront distribution pointing to my S3 origin. This allows AWS to cache the images at edge locations globally. If a user in Spain requests their avatar, it is served from a local cache rather than traveling all the way to my bucket in Sweden.&lt;/p&gt;

&lt;p&gt;(The Backend Fix)&lt;br&gt;
I updated my Python Lambda function so that when a user uploads a new photo, the backend returns the new cloudfront.net URL instead of the raw S3 endpoint.&lt;/p&gt;

&lt;p&gt;(The Frontend Fix)&lt;br&gt;
To make it even faster, I implemented a local caching strategy in React. I mapped my useState hook for the avatar to localStorage. Now, the browser remembers the CloudFront URL instantly on page load, eliminating the awkward UI flash while React waits for the API response.&lt;/p&gt;

&lt;p&gt;Next time you use S3 for public assets, put CloudFront in front of it. Your users (and your bandwidth bill) will thank you!&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%2Fbir34xwefuj6uvhdktr8.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%2Fbir34xwefuj6uvhdktr8.png" alt=" " width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>react</category>
      <category>serverless</category>
      <category>webperf</category>
    </item>
    <item>
      <title>Day 75: Building a "Nuclear" Delete Button and S3 Avatar Uploads</title>
      <dc:creator>Eric Rodríguez</dc:creator>
      <pubDate>Wed, 06 May 2026 16:00:00 +0000</pubDate>
      <link>https://dev.to/ericrodriguez10/day-75-building-a-nuclear-delete-button-and-s3-avatar-uploads-231h</link>
      <guid>https://dev.to/ericrodriguez10/day-75-building-a-nuclear-delete-button-and-s3-avatar-uploads-231h</guid>
      <description>&lt;p&gt;Today I tackled user profile management in my serverless financial app. I added AWS S3 for profile pictures and a Nuclear Button for absolute data deletion.&lt;/p&gt;

&lt;p&gt;(The Avatar Upload)&lt;br&gt;
Sending binary files through API Gateway can be tricky. Instead of dealing with multipart/form-data natively in the API Gateway, I converted the images to base64 in React. My Python Lambda takes this string, decodes it, and uses boto3 (s3_client.put_object) to store the image in an S3 bucket with an ACL of 'public-read'.&lt;/p&gt;

&lt;p&gt;(The Nuclear Button)&lt;br&gt;
Soft deletes are easy, but real privacy requires hard deletes. When a user clicks "Delete Account" in the React Danger Zone, the Lambda function executes two critical steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;DynamoDB Purge: It queries the Single-Table design for the user's ID and uses a batch_writer to destroy every single record (transactions, preferences, semantic profiles).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cognito Annihilation: It uses the cognito-idp client (admin_delete_user) to completely remove the user identity from the User Pool.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are building SaaS tools, give your users a real exit door. It builds trust and keeps your database clean of inactive 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.amazonaws.com%2Fuploads%2Farticles%2Fwhx5kou40z69ltp426nw.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%2Fwhx5kou40z69ltp426nw.png" alt=" " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>react</category>
      <category>python</category>
    </item>
    <item>
      <title>Day 74: Use Glassmorphism and Narrative to Tame Your AI App First-Log-In Latency</title>
      <dc:creator>Eric Rodríguez</dc:creator>
      <pubDate>Tue, 05 May 2026 16:00:00 +0000</pubDate>
      <link>https://dev.to/ericrodriguez10/day-74-use-glassmorphism-and-narrative-to-tame-your-ai-app-first-log-in-latency-44n3</link>
      <guid>https://dev.to/ericrodriguez10/day-74-use-glassmorphism-and-narrative-to-tame-your-ai-app-first-log-in-latency-44n3</guid>
      <description>&lt;p&gt;When building AI-powered apps, GenAI is not the only source of latency. External banking APIs, database insertions, and model context generation add measurable seconds during initial user provisioning.&lt;/p&gt;

&lt;p&gt;For a new user, 10 seconds of a raw spinner or a blank screen means this app is broken.&lt;/p&gt;

&lt;p&gt;Today, I scrapped generic raw spinners. I moved away from a passive loading component and architected an immersive Provisioning state in React to manage cold-boot anxiety.&lt;/p&gt;

&lt;p&gt;React detects a new user (no transactions and no name in database). It forces a profile modal first. Only when the user hits Save does the application trigger the expensive data fetch and immediately invoke a conditional state. This activates a backdrop-blur glassmorphism full-screen overlay.&lt;/p&gt;

&lt;p&gt;The overlay replaces the Raw Spinner with a narrative sequence: provisioning agent, retrieving footprint, training models. The wait feels productive and professional, not broken.&lt;/p&gt;

&lt;p&gt;By managing anxiety rather than just optimizing code, we achieved a professional Fintech onboarding flow. Code for speed, architect for sanity!&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%2Fm2g4kge9uwxdgsophdig.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%2Fm2g4kge9uwxdgsophdig.png" alt=" " width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>ux</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Day 73: Stop AWS Cognito from duplicating your users</title>
      <dc:creator>Eric Rodríguez</dc:creator>
      <pubDate>Mon, 04 May 2026 16:00:00 +0000</pubDate>
      <link>https://dev.to/ericrodriguez10/day-73-stop-aws-cognito-from-duplicating-your-users-2pma</link>
      <guid>https://dev.to/ericrodriguez10/day-73-stop-aws-cognito-from-duplicating-your-users-2pma</guid>
      <description>&lt;p&gt;Integrating Social SSO into your React app is supposed to make life easier. But if you aren't careful with how your backend handles identities, you will create a massive headache for yourself.&lt;/p&gt;

&lt;p&gt;Today, I realized my AWS Cognito integration was silently creating duplicate accounts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; I had users who originally signed up with an email and password. When I added "Sign in with Google", Cognito treated those returning users as completely new entities because they had a new internal &lt;code&gt;sub&lt;/code&gt; ID. My DynamoDB tables were fragmenting. Worse, my AI Engine (Amazon Bedrock) was being invoked from scratch for these returning users, driving up my cloud bill unnecessarily and destroying loading times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architectural Fix (Lambda Interceptor)&lt;/strong&gt;&lt;br&gt;
I couldn't let Cognito dictate my database schema. I modified my main Lambda router to intercept the incoming JWTs from the React frontend before they hit the database.&lt;/p&gt;

&lt;p&gt;Instead of blindly querying DynamoDB using the &lt;code&gt;sub&lt;/code&gt; provided by the auth header, I decoded the token to extract the raw email.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
# Inside the Lambda Authorizer / Router
token = auth_header.split(' ')[1]
payload = json.loads(base64.b64decode(payload_b64).decode('utf-8'))

user_email_jwt = payload.get('email', '')
real_name = payload.get('name') or payload.get('given_name')

# Force Unification: Use email as the absolute DB key
if user_email_jwt:
    user_id = user_email_jwt.lower()
    user_name = real_name if real_name else user_email_jwt.split('@')[0].capitalize()
else:
    user_id = payload.get('sub', DEFAULT_USER_ID)

By enforcing the email as the Primary Key in DynamoDB, the data source of truth shifted back to my backend. Immediate load times were restored.

The Frontend Polish
While I was at it, I fixed two nagging local development bugs:

Vite Port Binding: Vite kept binding to random ports when I used the --host flag, breaking my strict Cognito Allowed Callback URLs. I updated my App.tsx to dynamically read window.location.origin so I don't have to hardcode ports anymore.

Session Contamination: To ensure the dual-identity bug didn't leave cached artifacts behind, I overrode the AWS Amplify signOut function to completely wipe localStorage before redirecting the user.

Own your user data logic. Code for engagement, but architect for sanity!

![ ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zlwuk92ldmqbzqmb90rt.png)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>react</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Day 71: OpenGraph Meta Tags &amp; Preparing Google OAuth</title>
      <dc:creator>Eric Rodríguez</dc:creator>
      <pubDate>Sat, 02 May 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/ericrodriguez10/day-71-opengraph-meta-tags-preparing-google-oauth-10jf</link>
      <guid>https://dev.to/ericrodriguez10/day-71-opengraph-meta-tags-preparing-google-oauth-10jf</guid>
      <description>&lt;p&gt;Today I fixed two critical "Top of Funnel" issues in my Serverless app: Link Previews and Login Friction.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The OpenGraph Fix
If you paste your React app's link in Slack or Discord and it looks blank, you are missing OpenGraph tags. I updated my index.html :&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Added og:image and og:description for standard previews.&lt;/p&gt;

&lt;p&gt;Added twitter:card="summary_large_image" (Yes, it's still called twitter under the hood!).&lt;/p&gt;

&lt;p&gt;Updated apple-touch-icon for mobile bookmarks.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Preparing Google Auth for AWS Cognito
I hate passwords. To implement "Sign in with Google", you need a bridge.
Today I went into the Google Cloud Console:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Created an OAuth Consent Screen.&lt;/p&gt;

&lt;p&gt;Generated an OAuth 2.0 Client ID.&lt;/p&gt;

&lt;p&gt;Set the Redirect URI to match my AWS Cognito Domain endpoint (https://.auth.&lt;a href="https://.amazoncognito.com/oauth2/idpresponse" rel="noopener noreferrer"&gt;.amazoncognito.com/oauth2/idpresponse&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%2Fu0cg6fh4kxzcx10kzbep.jpg" 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%2Fu0cg6fh4kxzcx10kzbep.jpg" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>react</category>
      <category>seo</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Day 71: Secure your Naked Domain &amp; Stop SQS from DDOSing your API</title>
      <dc:creator>Eric Rodríguez</dc:creator>
      <pubDate>Fri, 01 May 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/ericrodriguez10/day-71-secure-your-naked-domain-stop-sqs-from-ddosing-your-api-3cfh</link>
      <guid>https://dev.to/ericrodriguez10/day-71-secure-your-naked-domain-stop-sqs-from-ddosing-your-api-3cfh</guid>
      <description>&lt;p&gt;Today I fixed two major production risks in my Serverless Fintech app.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Fixing the HTTPS "Not Secure" warning on Apex Domains&lt;br&gt;
If users type duromoney.com, they shouldn't see a security error.&lt;br&gt;
Fix: Go to your DNS registrar (e.g., IONOS) and delete standard redirects. Create an A-Record for @ pointing to your hosting provider's Load Balancer IP. Then, provision an SSL certificate that explicitly covers both the root and www domains.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Preventing SQS from breaking downstream APIs&lt;br&gt;
My SES email limit is 14/sec. If SQS dumps 10k messages into AWS Lambda, the system crashes from 429 Rate Exceeded errors.&lt;br&gt;
Fix: Do NOT use Lambda Reserved Concurrency (it blocks your web API traffic if you use a Fat Lambda pattern). Instead, set the Maximum Concurrency directly on the SQS Trigger (Event Source Mapping) to 10. SQS is now bottlenecked at the source, processing messages smoothly without hitting rate limits.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Build for speed, but configure for control!&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%2Fbpwhd123vdyl2bbzmd6u.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%2Fbpwhd123vdyl2bbzmd6u.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>aws</category>
      <category>architecture</category>
      <category>security</category>
    </item>
    <item>
      <title>Build a Python recommendation engine for your Fintech app 💳</title>
      <dc:creator>Eric Rodríguez</dc:creator>
      <pubDate>Thu, 30 Apr 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/ericrodriguez10/build-a-python-recommendation-engine-for-your-fintech-app-1f7k</link>
      <guid>https://dev.to/ericrodriguez10/build-a-python-recommendation-engine-for-your-fintech-app-1f7k</guid>
      <description>&lt;p&gt;Day 70 of my #100DaysOfCloud journey! Today I focused on the business side of engineering: Monetization.&lt;/p&gt;

&lt;p&gt;I wanted my React dashboard to show tailored financial offers (like high-yield accounts or cheap transfer apps) based on the user's actual spending habits.&lt;/p&gt;

&lt;p&gt;The Backend Logic (Python + AWS Lambda):&lt;br&gt;
Instead of random ads, I built a smart router. It calculates the user's projected surplus and injects a specific JSON offer.&lt;/p&gt;

&lt;p&gt;Python&lt;br&gt;
def generate_financial_offers(fin_score, surplus):&lt;br&gt;
    offers = []&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Investor Profile
if surplus &amp;gt; 1000 and fin_score &amp;gt;= 70:
    offers.append({
        "title": "Make your surplus work for you",
        "description": f"You have ~{surplus}€ uninvested. Earn 4% APY.",
        "cta_text": "Explore Brokers"
    })
# High-Burn Profile
elif surplus &amp;lt; 200:
    offers.append({
        "title": "Lower your banking fees",
        "description": "Stop bleeding money on transfers.",
        "cta_text": "Open Zero-Fee Account"
    })

return offers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Why this matters:&lt;br&gt;
This is the Adapter Pattern. Right now, the offers are hardcoded mocks. But the frontend doesn't know that. When I get approved for real Fintech Affiliate APIs, I will just swap out this Python function to fetch live data, and the React UI won't need a single line of code changed.&lt;/p&gt;

&lt;p&gt;Decoupling your business logic from your UI is key! 🚀&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%2Ff3bz59efd4tipd0xkf48.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%2Ff3bz59efd4tipd0xkf48.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>aws</category>
      <category>serverless</category>
      <category>fintech</category>
    </item>
    <item>
      <title>How to stop your AI from hallucinating financial data 🛑🤖</title>
      <dc:creator>Eric Rodríguez</dc:creator>
      <pubDate>Wed, 29 Apr 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/ericrodriguez10/how-to-stop-your-ai-from-hallucinating-financial-data-5f1p</link>
      <guid>https://dev.to/ericrodriguez10/how-to-stop-your-ai-from-hallucinating-financial-data-5f1p</guid>
      <description>&lt;p&gt;Day 69 of my #100DaysOfCloud challenge! Today was all about QA testing my AI Prompts.&lt;/p&gt;

&lt;p&gt;If you let a standard LLM loose on financial questions, it will eventually hallucinate fake statistics to sound smart. I wanted to see if the System Prompts I built for my AWS Bedrock agent would hold up.&lt;/p&gt;

&lt;p&gt;I asked my agent to compare my food spending against the "national average for 28-year-olds".&lt;/p&gt;

&lt;p&gt;The Response:&lt;br&gt;
"You've spent €54.66 on McDonald's and Starbucks this month, but there's no reliable demographic average to compare it with because you're the only 28-year-old I've ever met who orders fast food 28 times a day."&lt;/p&gt;

&lt;p&gt;Why this is an architectural win:&lt;br&gt;
The AI correctly pulled the true data from my DynamoDB database (€54.66). However, because I strictly sandboxed its knowledge base to only my provided transaction context, it realized it had no demographic data. Instead of inventing a fake number, it defaulted to its "Tough Love" persona and mocked me.&lt;/p&gt;

&lt;p&gt;Takeaway for builders:&lt;br&gt;
When writing prompts for data-heavy apps, always give the AI an "exit route" (like sarcasm or a hard 'I don't know') for when it lacks data. A funny refusal is infinitely better than a confident lie.&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%2Fuumv6n4b55cl1td9dc4l.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%2Fuumv6n4b55cl1td9dc4l.png" alt=" " width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ai</category>
      <category>promptengineering</category>
      <category>serverless</category>
    </item>
    <item>
      <title>I found a 1650% cost spike in my AWS Account</title>
      <dc:creator>Eric Rodríguez</dc:creator>
      <pubDate>Tue, 28 Apr 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/ericrodriguez10/i-found-a-1650-cost-spike-in-my-aws-account-5dkn</link>
      <guid>https://dev.to/ericrodriguez10/i-found-a-1650-cost-spike-in-my-aws-account-5dkn</guid>
      <description>&lt;p&gt;Day 68 of my #100DaysOfCloud challenge! I was short on time today, so I went to the console to do a quick 5-minute FinOps check.&lt;/p&gt;

&lt;p&gt;I opened AWS Cost Anomaly Detection, expecting to set it up from scratch. Instead, I found out it had already caught a massive anomaly: a 1650% spike in my daily spend a few days ago!&lt;/p&gt;

&lt;p&gt;Luckily, because I'm using Serverless free-tier services mostly, the spike only cost me $0.33. But the lesson is huge.&lt;/p&gt;

&lt;p&gt;Why static budgets aren't enough:&lt;br&gt;
If you set a budget for $10, AWS will only warn you when you hit $10. But if an infinite loop in your Lambda function causes a 2000% spike in executions, you want to know immediately, not 5 days later when it finally hits the $10 mark.&lt;/p&gt;

&lt;p&gt;Cost Anomaly Detection uses Machine Learning to learn your normal pattern and warns you about the behavior, not just the total sum.&lt;/p&gt;

&lt;p&gt;Action item for today:&lt;br&gt;
Go to your AWS Billing Console, check Cost Anomaly Detection, and most importantly: click on Alert subscriptions to ensure it actually emails you when things go wrong! 🛡️&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%2Fzpobdc8bpjvjfzxyxmb9.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%2Fzpobdc8bpjvjfzxyxmb9.png" alt=" " width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>finops</category>
      <category>serverless</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Day 67: Escaping the Sandbox. Wiring a Live Banking API to AWS Lambda</title>
      <dc:creator>Eric Rodríguez</dc:creator>
      <pubDate>Mon, 27 Apr 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/ericrodriguez10/day-67-escaping-the-sandbox-wiring-a-live-banking-api-to-aws-lambda-1j8g</link>
      <guid>https://dev.to/ericrodriguez10/day-67-escaping-the-sandbox-wiring-a-live-banking-api-to-aws-lambda-1j8g</guid>
      <description>&lt;p&gt;Today was the day my financial SaaS stopped being a toy. For Day 67, I replaced my simulated Plaid data with a live connection to the Wise API.&lt;/p&gt;

&lt;p&gt;The Challenge:&lt;br&gt;
Mock data is clean and predictable. Live data is messy. When I updated my Lambda orchestrator to pull real EUR transactions, I immediately hit issues with data duplication in my DynamoDB tables and aggressive caching from my React frontend.&lt;/p&gt;

&lt;p&gt;The Debugging Process:&lt;br&gt;
When the UI wouldn't update, I had to drop down to the browser console. I wrote a quick script to extract my JWT token from localStorage and fired a direct fetch request to my Lambda URL, appending ?sync=true to force a fresh pull from Wise.&lt;/p&gt;

&lt;p&gt;Seeing that { "status": "success" } response and the array of 100 real transactions log into the console was the highlight of the week.&lt;/p&gt;

&lt;p&gt;Next up: refining the multi-tenant routing so I can seamlessly switch between simulated demo users and live production accounts.&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%2Fyb0cbdy2zx2oq3rwrdmr.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%2Fyb0cbdy2zx2oq3rwrdmr.png" alt=" " width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>api</category>
      <category>react</category>
    </item>
  </channel>
</rss>
