<?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: Abuwa</title>
    <description>The latest articles on DEV Community by Abuwa (@abuwa).</description>
    <link>https://dev.to/abuwa</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%2F3851883%2Fa06eb7e2-6672-4645-922d-a41144bf93a6.png</url>
      <title>DEV Community: Abuwa</title>
      <link>https://dev.to/abuwa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abuwa"/>
    <language>en</language>
    <item>
      <title>Reviving BookNook: From an Unfinished API to a Live AWS Reading Tracker</title>
      <dc:creator>Abuwa</dc:creator>
      <pubDate>Tue, 02 Jun 2026 14:09:37 +0000</pubDate>
      <link>https://dev.to/abuwa/reviving-booknook-from-an-unfinished-api-to-a-live-aws-reading-tracker-28l2</link>
      <guid>https://dev.to/abuwa/reviving-booknook-from-an-unfinished-api-to-a-live-aws-reading-tracker-28l2</guid>
      <description>&lt;h1&gt;
  
  
  Reviving BookNook: From an Unfinished Local API to an AWS-Deployed Reading Tracker
&lt;/h1&gt;

&lt;p&gt;This is my submission for the GitHub Finish-Up-A-Thon Challenge.&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;BookNook&lt;/strong&gt;, a personal reading tracker API that helps users manage books they are reading, planning to read, or have completed.&lt;/p&gt;

&lt;p&gt;The API supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding a book&lt;/li&gt;
&lt;li&gt;Viewing all books&lt;/li&gt;
&lt;li&gt;Viewing one book by ID&lt;/li&gt;
&lt;li&gt;Updating book details&lt;/li&gt;
&lt;li&gt;Deleting a book&lt;/li&gt;
&lt;li&gt;Uploading a book cover image&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The revived version is now deployed on AWS and uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js and Express for the backend API&lt;/li&gt;
&lt;li&gt;Amazon DynamoDB for storing book records&lt;/li&gt;
&lt;li&gt;Amazon S3 for storing book cover images&lt;/li&gt;
&lt;li&gt;AWS Elastic Beanstalk for public deployment&lt;/li&gt;
&lt;li&gt;AWS IAM roles and policies for permissions&lt;/li&gt;
&lt;li&gt;GitHub for version control&lt;/li&gt;
&lt;li&gt;GitHub Copilot for refactoring, code review, and documentation support&lt;/li&gt;
&lt;/ul&gt;




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

&lt;h3&gt;
  
  
  API Health Endpoint
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://booknook-api-prod.eba-mhycv2pm.us-east-1.elasticbeanstalk.com/api/health" rel="noopener noreferrer"&gt;http://booknook-api-prod.eba-mhycv2pm.us-east-1.elasticbeanstalk.com/api/health&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This endpoint confirms that the deployed API is healthy and connected to AWS services.&lt;/p&gt;

&lt;p&gt;Expected response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"healthy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"database"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DynamoDB connected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"storage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"S3 configured"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"us-east-1"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fkt5kl3qu6wowx4ktek75.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%2Fkt5kl3qu6wowx4ktek75.png" alt=" " width="797" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  View All Books
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://booknook-api-prod.eba-mhycv2pm.us-east-1.elasticbeanstalk.com/api/books" rel="noopener noreferrer"&gt;http://booknook-api-prod.eba-mhycv2pm.us-east-1.elasticbeanstalk.com/api/books&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This endpoint returns all books stored in DynamoDB.&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%2Fude8q0ct8cled9cbvtut.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%2Fude8q0ct8cled9cbvtut.png" alt=" " width="799" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Uploaded Book Cover Image
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://booknook-covers-abuwa-2026.s3.us-east-1.amazonaws.com/covers/book-4cdfa13c-26a8-4882-906a-4f8302fbfe88.jpg" rel="noopener noreferrer"&gt;https://booknook-covers-abuwa-2026.s3.us-east-1.amazonaws.com/covers/book-4cdfa13c-26a8-4882-906a-4f8302fbfe88.jpg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This shows that the cover image upload flow works. The API uploaded the image to Amazon S3 and stored the cover URL with the book record.&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%2Fzk1481he1nmck93smxgq.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%2Fzk1481he1nmck93smxgq.png" alt=" " width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Repository
&lt;/h2&gt;

&lt;p&gt;GitHub repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/eghareabuwa-arch/booknook-api/tree/aws-version" rel="noopener noreferrer"&gt;https://github.com/eghareabuwa-arch/booknook-api/tree/aws-version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I used a separate branch for the revived AWS version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main        - original/local-Azure version
aws-version - revived AWS-deployed version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Before: The Unfinished Project
&lt;/h2&gt;

&lt;p&gt;BookNook originally started as a local Node.js and Express API experiment. I had earlier worked with Azure services such as Azure SQL Database, Azure Blob Storage, and Azure Key Vault.&lt;/p&gt;

&lt;p&gt;The earlier version helped me understand cloud-backed APIs, but it was not fully finished because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It was mainly tested locally.&lt;/li&gt;
&lt;li&gt;It did not have a public API link.&lt;/li&gt;
&lt;li&gt;It was not deployed for others to test.&lt;/li&gt;
&lt;li&gt;The documentation was incomplete.&lt;/li&gt;
&lt;li&gt;The Azure resources were later deleted due to cost concerns.&lt;/li&gt;
&lt;li&gt;The project needed a clear before-and-after completion story.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, BookNook was a working prototype, but it was not fully shipped.&lt;/p&gt;




&lt;h2&gt;
  
  
  After: The Revived AWS Version
&lt;/h2&gt;

&lt;p&gt;For this challenge, I revived BookNook by rebuilding the cloud backend on AWS and deploying it publicly.&lt;/p&gt;

&lt;p&gt;The completed AWS version now has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A public API hosted on AWS Elastic Beanstalk&lt;/li&gt;
&lt;li&gt;Book records stored in Amazon DynamoDB&lt;/li&gt;
&lt;li&gt;Book cover image uploads stored in Amazon S3&lt;/li&gt;
&lt;li&gt;A working public health endpoint&lt;/li&gt;
&lt;li&gt;A working public books endpoint&lt;/li&gt;
&lt;li&gt;A working public S3 cover image URL&lt;/li&gt;
&lt;li&gt;IAM permissions configured for the deployed app&lt;/li&gt;
&lt;li&gt;GitHub repository and AWS branch&lt;/li&gt;
&lt;li&gt;Challenge-ready README documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project moved from a local unfinished API to a publicly accessible cloud API.&lt;/p&gt;




&lt;h2&gt;
  
  
  AWS Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client / Browser / Postman / curl
        |
        v
AWS Elastic Beanstalk
(Node.js Express API)
        |
        |----&amp;gt; Amazon DynamoDB
        |      Stores book records
        |
        |----&amp;gt; Amazon S3
               Stores uploaded book cover images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DynamoDB stores structured book data such as title, author, genre, status, rating, notes, coverUrl, and addedAt.&lt;/p&gt;

&lt;p&gt;S3 stores uploaded image files. The API uploads the book cover image to S3 and stores the public image URL in DynamoDB.&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%2F73af361c1rv92c6fe0sc.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%2F73af361c1rv92c6fe0sc.png" alt=" " width="800" height="282"&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%2Fjh1t88ltgyqwd9u3zt36.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%2Fjh1t88ltgyqwd9u3zt36.png" alt=" " width="800" height="282"&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%2Fdguu25j9q708z3v0hxyt.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%2Fdguu25j9q708z3v0hxyt.png" alt=" " width="800" height="189"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How GitHub Copilot Helped
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot helped me during the finishing process in several ways.&lt;/p&gt;

&lt;p&gt;First, it helped me think through how to refactor the earlier cloud-backed API idea into an AWS-based structure using DynamoDB and S3.&lt;/p&gt;

&lt;p&gt;Second, it helped me preserve the same REST API structure while changing the underlying cloud provider. I was able to maintain endpoints 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;GET /api/health
POST /api/books
GET /api/books
GET /api/books/:id
PUT /api/books/:id
DELETE /api/books/:id
POST /api/books/:id/cover
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Third, Copilot helped me review the Express API structure and improve documentation. I used it to organize the README, endpoint descriptions, and before-and-after story.&lt;/p&gt;

&lt;p&gt;Copilot did not replace my work, but it helped me move faster, stay organized, and continue when I got stuck.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshot to insert here:&lt;/strong&gt; Copilot screenshot, if available.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenges I Faced
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Moving from Azure to AWS
&lt;/h3&gt;

&lt;p&gt;I originally worked with Azure, but I deleted the Azure resource group because of cost concerns. I decided to continue the project on AWS using available free credit.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Changing the Backend Cloud Services
&lt;/h3&gt;

&lt;p&gt;The old idea used Azure SQL and Azure Blob Storage. The revived version uses DynamoDB and S3.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Azure SQL / local database idea  -&amp;gt; Amazon DynamoDB
Azure Blob Storage idea          -&amp;gt; Amazon S3
Local-only API                   -&amp;gt; AWS Elastic Beanstalk deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. UUID Package Issue
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;uuid&lt;/code&gt; package caused a compatibility issue with &lt;code&gt;require()&lt;/code&gt;. I fixed it by using Node.js built-in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. DynamoDB Permission Error
&lt;/h3&gt;

&lt;p&gt;After deploying to Elastic Beanstalk, the health endpoint initially returned an unhealthy response because the Elastic Beanstalk EC2 role did not have permission to scan DynamoDB.&lt;/p&gt;

&lt;p&gt;The missing permission was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dynamodb:Scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I fixed this by attaching DynamoDB permissions to the Elastic Beanstalk EC2 role.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. S3 Upload Permission Error
&lt;/h3&gt;

&lt;p&gt;The cover upload initially failed because the deployed app did not have permission to upload objects to S3.&lt;/p&gt;

&lt;p&gt;The missing permission was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s3:PutObject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I fixed this by attaching S3 permission to the Elastic Beanstalk EC2 role.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. S3 Public Access Issue
&lt;/h3&gt;

&lt;p&gt;After the image uploaded, the browser initially returned &lt;code&gt;AccessDenied&lt;/code&gt;. I fixed this by updating the bucket public access settings and bucket policy so the uploaded cover image could be viewed through its public S3 URL.&lt;/p&gt;




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

&lt;p&gt;This project helped me understand the difference between building locally and actually shipping.&lt;/p&gt;

&lt;p&gt;I learned how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure AWS CLI&lt;/li&gt;
&lt;li&gt;Create and use DynamoDB&lt;/li&gt;
&lt;li&gt;Create and use S3&lt;/li&gt;
&lt;li&gt;Deploy a Node.js API to Elastic Beanstalk&lt;/li&gt;
&lt;li&gt;Configure Elastic Beanstalk environment variables&lt;/li&gt;
&lt;li&gt;Fix IAM role permission issues&lt;/li&gt;
&lt;li&gt;Upload files from an API to S3&lt;/li&gt;
&lt;li&gt;Use Git branches to separate the original version from the revived version&lt;/li&gt;
&lt;li&gt;Document a project for public submission&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Use of Underlying Technology
&lt;/h3&gt;

&lt;p&gt;The project uses a real AWS cloud architecture with Elastic Beanstalk, DynamoDB, S3, IAM, Node.js, Express, GitHub, and GitHub Copilot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usability and User Experience
&lt;/h3&gt;

&lt;p&gt;The API is simple to test through a browser, Postman, or curl. The health endpoint clearly shows whether the API is connected to DynamoDB and S3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Originality and Creativity
&lt;/h3&gt;

&lt;p&gt;BookNook solves a practical personal problem: tracking books, reading progress, notes, ratings, and cover images.&lt;/p&gt;

&lt;h3&gt;
  
  
  Completion Arc
&lt;/h3&gt;

&lt;p&gt;The project has a clear before-and-after journey.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Local prototype
Azure experiment
No public API link
Incomplete deployment
Incomplete documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AWS-deployed API
DynamoDB database
S3 cover image upload
Public API health endpoint
Public books endpoint
Public S3 cover image URL
GitHub repository and AWS branch
Challenge-ready documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Links
&lt;/h2&gt;

&lt;p&gt;GitHub repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/eghareabuwa-arch/booknook-api/tree/aws-version" rel="noopener noreferrer"&gt;https://github.com/eghareabuwa-arch/booknook-api/tree/aws-version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live API health endpoint:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://booknook-api-prod.eba-mhycv2pm.us-east-1.elasticbeanstalk.com/api/health" rel="noopener noreferrer"&gt;http://booknook-api-prod.eba-mhycv2pm.us-east-1.elasticbeanstalk.com/api/health&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live books endpoint:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://booknook-api-prod.eba-mhycv2pm.us-east-1.elasticbeanstalk.com/api/books" rel="noopener noreferrer"&gt;http://booknook-api-prod.eba-mhycv2pm.us-east-1.elasticbeanstalk.com/api/books&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live uploaded cover image:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://booknook-covers-abuwa-2026.s3.us-east-1.amazonaws.com/covers/book-4cdfa13c-26a8-4882-906a-4f8302fbfe88.jpg" rel="noopener noreferrer"&gt;https://booknook-covers-abuwa-2026.s3.us-east-1.amazonaws.com/covers/book-4cdfa13c-26a8-4882-906a-4f8302fbfe88.jpg&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Reflection
&lt;/h2&gt;

&lt;p&gt;This challenge helped me push BookNook from “almost done” to actually shipped.&lt;/p&gt;

&lt;p&gt;Before, it was a local/cloud experiment. Now, it is a deployed AWS API with persistent storage, cover image upload, public links, documentation, and a clear before-and-after journey.&lt;/p&gt;

&lt;p&gt;The biggest win for me was learning how to move from a working local backend to a cloud-hosted API that others can test.&lt;/p&gt;

</description>
      <category>githubchallenge</category>
      <category>devchallenge</category>
      <category>aws</category>
      <category>githubcopilot</category>
    </item>
  </channel>
</rss>
