<?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: Gilbert Ngeno</title>
    <description>The latest articles on DEV Community by Gilbert Ngeno (@gilly7).</description>
    <link>https://dev.to/gilly7</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%2F582438%2Fab6ff99a-cf2c-447f-a521-39f5e658c10f.png</url>
      <title>DEV Community: Gilbert Ngeno</title>
      <link>https://dev.to/gilly7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gilly7"/>
    <language>en</language>
    <item>
      <title>When Your Database Becomes the Bottleneck: Scaling the Data Layer Before It Takes Down Your Application</title>
      <dc:creator>Gilbert Ngeno</dc:creator>
      <pubDate>Thu, 17 Sep 2026 17:45:03 +0000</pubDate>
      <link>https://dev.to/gilly7/when-your-database-becomes-the-bottleneck-scaling-the-data-layer-before-it-takes-down-your-3f4k</link>
      <guid>https://dev.to/gilly7/when-your-database-becomes-the-bottleneck-scaling-the-data-layer-before-it-takes-down-your-3f4k</guid>
      <description>&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%2Focw95vydf2e81nraj77f.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%2Focw95vydf2e81nraj77f.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a common assumption in modern application architecture:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the application gets more traffic, add more application servers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That works surprisingly well—until it doesn't.&lt;/p&gt;

&lt;p&gt;You add more Kubernetes pods. You increase the replica count. You enable autoscaling. Yet the application is still slow.&lt;/p&gt;

&lt;p&gt;Requests continue timing out.&lt;/p&gt;

&lt;p&gt;Users complain that pages take too long to load.&lt;/p&gt;

&lt;p&gt;Then you look deeper into the architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    Internet
                       │
                       ▼
                ┌─────────────┐
                │Load Balancer│
                └──────┬──────┘
                       │
             ┌─────────┼─────────┐
             ▼         ▼         ▼
          ┌─────┐   ┌─────┐   ┌─────┐
          │ API │   │ API │   │ API │
          │ Pod │   │ Pod │   │ Pod │
          └──┬──┘   └──┬──┘   └──┬──┘
             │         │         │
             └─────────┼─────────┘
                       ▼
                ┌─────────────┐
                │  Database   │
                └─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application tier has scaled.&lt;/p&gt;

&lt;p&gt;The database has not.&lt;/p&gt;

&lt;p&gt;This is one of the most important challenges in production engineering because databases don't scale in exactly the same way as stateless application servers.&lt;/p&gt;

&lt;p&gt;You can often add another API pod in seconds.&lt;/p&gt;

&lt;p&gt;You cannot simply add another database and expect the workload to double in capacity.&lt;/p&gt;

&lt;p&gt;The question therefore becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How do you increase data-layer capacity without introducing unnecessary complexity or destabilizing the system?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  1. Start by Finding the Real Bottleneck
&lt;/h1&gt;

&lt;p&gt;Before changing the architecture, establish what is actually limiting performance.&lt;/p&gt;

&lt;p&gt;A slow application does not necessarily mean the database needs more hardware.&lt;/p&gt;

&lt;p&gt;The database could be spending most of its resources on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inefficient queries&lt;/li&gt;
&lt;li&gt;missing indexes&lt;/li&gt;
&lt;li&gt;excessive connections&lt;/li&gt;
&lt;li&gt;lock contention&lt;/li&gt;
&lt;li&gt;disk I/O&lt;/li&gt;
&lt;li&gt;large result sets&lt;/li&gt;
&lt;li&gt;analytical workloads&lt;/li&gt;
&lt;li&gt;replication&lt;/li&gt;
&lt;li&gt;cache misses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful investigation starts with four dimensions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                       Database
                          │
          ┌───────────────┼───────────────┐
          ▼               ▼               ▼
         CPU             Memory           I/O
          │               │               │
     Query cost       Cache usage      Disk latency
     CPU saturation   Buffer usage     IOPS

                    + Connections
                    + Locks
                    + Replication lag
                    + Query latency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at both infrastructure and query-level metrics.&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;CPU Usage              87%
Active Connections     920 / 1000
P95 Query Latency      480ms
Disk Latency           22ms
Replication Lag        4.2s
Slow Queries           18
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These measurements tell a very different story from simply saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The database is slow."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first rule of database scaling is therefore simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measure before modifying the architecture.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Remove Work Before Adding Capacity
&lt;/h1&gt;

&lt;p&gt;The cheapest database capacity is the capacity you don't need.&lt;/p&gt;

&lt;p&gt;This is where query optimization belongs.&lt;/p&gt;

&lt;p&gt;Suppose an order-history endpoint executes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the table contains hundreds of millions of rows and the query lacks an appropriate index, the database may perform far more work than necessary.&lt;/p&gt;

&lt;p&gt;A suitable index can change the access pattern from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Millions of rows
       │
       ▼
    Scan rows
       │
       ▼
     Filter
       │
       ▼
      Sort
       │
       ▼
    Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       Index
         │
         ▼
 customer_id
         │
         ▼
 created_at
         │
         ▼
 Required rows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same principle applies to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;selecting unnecessary columns&lt;/li&gt;
&lt;li&gt;retrieving enormous result sets&lt;/li&gt;
&lt;li&gt;inefficient joins&lt;/li&gt;
&lt;li&gt;missing indexes&lt;/li&gt;
&lt;li&gt;repeated queries&lt;/li&gt;
&lt;li&gt;offset-heavy pagination&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For large datasets, cursor-based pagination can also prevent increasingly expensive scans when users move deep into a result set.&lt;/p&gt;

&lt;p&gt;The important idea is that &lt;strong&gt;scaling should begin with reducing unnecessary work, not immediately adding infrastructure&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Control How Much Traffic Reaches the Database
&lt;/h1&gt;

&lt;p&gt;Even efficient queries can overwhelm a database if too many requests arrive simultaneously.&lt;/p&gt;

&lt;p&gt;One common source of pressure is database connections.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 API Pods
     │
     │ 100 connections each
     ▼
10,000 database connections
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The database may spend significant resources managing connections instead of processing useful work.&lt;/p&gt;

&lt;p&gt;Connection pooling gives the application a controlled pool of reusable connections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 API Pods
                    │
                    ▼
            ┌───────────────┐
            │Connection Pool│
            └───────┬───────┘
                    │
          Controlled connections
                    │
                    ▼
               Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pool must be sized according to actual database capacity.&lt;/p&gt;

&lt;p&gt;More connections do not automatically mean more throughput. Beyond a certain point, concurrency can increase contention and reduce overall performance.&lt;/p&gt;

&lt;p&gt;The same principle applies to traffic.&lt;/p&gt;

&lt;p&gt;If a sudden spike sends far more requests than the database can process, rate limiting and backpressure can prevent the data layer from being overwhelmed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Clients
   │
   ▼
API Gateway
   │
   ▼
Rate Limit / Queue
   │
   ▼
Application
   │
   ▼
Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This turns an uncontrolled traffic spike into a workload the database can actually handle.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Keep Repetitive Reads Away From the Database
&lt;/h1&gt;

&lt;p&gt;Not every request needs to reach the database.&lt;/p&gt;

&lt;p&gt;Suppose thousands of users request the same product information.&lt;/p&gt;

&lt;p&gt;Without caching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000 requests
      │
      ▼
1,000 database queries
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With a cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000 requests
      │
      ▼
    Cache
      │
      ├── Cache hits → Response
      │
      └── Cache miss
              │
              ▼
          Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caching is particularly useful for data that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;is requested frequently&lt;/li&gt;
&lt;li&gt;changes relatively infrequently&lt;/li&gt;
&lt;li&gt;is expensive to compute&lt;/li&gt;
&lt;li&gt;can tolerate a defined amount of staleness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Typical examples include product information, configuration, permissions, and reference data.&lt;/p&gt;

&lt;p&gt;However, caching introduces another engineering problem: invalidation.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;When does cached data expire?&lt;/li&gt;
&lt;li&gt;What happens when data changes?&lt;/li&gt;
&lt;li&gt;Can stale data be shown?&lt;/li&gt;
&lt;li&gt;What happens when many requests miss the cache simultaneously?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A cache therefore isn't simply "put Redis in front of the database." It is another consistency boundary that needs to be designed and monitored.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Separate Reads From Writes
&lt;/h1&gt;

&lt;p&gt;If the workload is primarily read-heavy, a single database may be spending most of its capacity serving queries that don't modify data.&lt;/p&gt;

&lt;p&gt;Read replicas can distribute that workload.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    Application
                   /           \
                  /             \
             Writes             Reads
                │                 │
                ▼                 ▼
           ┌─────────┐      ┌───────────┐
           │ Primary │─────►│ Replica 1 │
           └─────────┘      └───────────┘
                                  │
                         ┌────────┴────────┐
                         ▼                 ▼
                    Replica 2         Replica 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The primary handles writes while replicas serve suitable read traffic.&lt;/p&gt;

&lt;p&gt;This can provide substantial additional read capacity without changing the application's fundamental data model.&lt;/p&gt;

&lt;p&gt;But replicas introduce &lt;strong&gt;replication lag&lt;/strong&gt;.&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;Primary:
Order status = SHIPPED

Replica:
Order status = PROCESSING
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the application immediately reads after a write, it may observe stale information.&lt;/p&gt;

&lt;p&gt;Applications therefore need to distinguish between operations requiring:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;strong consistency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and those that can tolerate:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;eventual consistency&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example, an order immediately after payment may need to be read from the primary, while a product catalog page may safely use a replica.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Stop Using the Transactional Database for Everything
&lt;/h1&gt;

&lt;p&gt;A common source of database pressure is workload mixing.&lt;/p&gt;

&lt;p&gt;The same database might simultaneously handle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer transactions
Inventory updates
Reports
Analytics
Search
Exports
Background jobs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These workloads have very different characteristics.&lt;/p&gt;

&lt;p&gt;A customer placing an order requires a predictable transactional response.&lt;/p&gt;

&lt;p&gt;An analytics query scanning 500 million rows does not.&lt;/p&gt;

&lt;p&gt;Running both against the same database creates competition for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU&lt;/li&gt;
&lt;li&gt;memory&lt;/li&gt;
&lt;li&gt;disk I/O&lt;/li&gt;
&lt;li&gt;connections&lt;/li&gt;
&lt;li&gt;locks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A better architecture separates them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                         Primary DB
                             │
              ┌──────────────┼──────────────┐
              │              │              │
              ▼              ▼              ▼
          Application      CDC / ETL      Replicas
                             │
                             ▼
                     Analytics Platform
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change Data Capture (CDC) can stream database changes into systems designed for analytical workloads.&lt;/p&gt;

&lt;p&gt;The same principle applies to search.&lt;/p&gt;

&lt;p&gt;Instead of forcing a transactional database to perform complex full-text searches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Application
                /           \
               ▼             ▼
       Transaction DB    Search Engine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the database remains the source of truth while a specialized search system handles search-oriented workloads.&lt;/p&gt;

&lt;p&gt;This is an example of &lt;strong&gt;workload specialization&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Partition Data When Tables Become Too Large
&lt;/h1&gt;

&lt;p&gt;Sometimes the workload itself is reasonable, but the dataset has become enormous.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;orders
500,000,000 rows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maintaining and querying a single structure at this size can become increasingly expensive.&lt;/p&gt;

&lt;p&gt;Partitioning divides the table into smaller logical pieces.&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;orders
│
├── 2024
│   ├── Q1
│   ├── Q2
│   ├── Q3
│   └── Q4
│
└── 2025
    ├── Q1
    ├── Q2
    ├── Q3
    └── Q4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A query for recent orders can then operate on a smaller portion of the dataset.&lt;/p&gt;

&lt;p&gt;Partitioning can also simplify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;archival&lt;/li&gt;
&lt;li&gt;data retention&lt;/li&gt;
&lt;li&gt;maintenance&lt;/li&gt;
&lt;li&gt;index management&lt;/li&gt;
&lt;li&gt;deletion of old data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But partitioning only helps when the partition key aligns with actual access patterns.&lt;/p&gt;

&lt;p&gt;Choosing a poor partition key can simply move the bottleneck somewhere else.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. When One Database Is No Longer Enough: Sharding
&lt;/h1&gt;

&lt;p&gt;Eventually, a single database instance may reach a fundamental capacity limit.&lt;/p&gt;

&lt;p&gt;At this point, the workload can be distributed across multiple database instances.&lt;/p&gt;

&lt;p&gt;This is sharding.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                     Application
                          │
             ┌────────────┼────────────┐
             ▼            ▼            ▼
          Shard 1       Shard 2       Shard 3
             │            │            │
          Users A-D     Users E-M     Users N-Z
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A shard key determines where a record belongs.&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;hash(customer_id)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;might distribute customers across several databases.&lt;/p&gt;

&lt;p&gt;This increases the amount of data and workload the system can handle collectively.&lt;/p&gt;

&lt;p&gt;But it also introduces significant complexity.&lt;/p&gt;

&lt;p&gt;A query that previously required one database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT *
FROM orders
WHERE customer_id = 1234;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may remain straightforward if the application knows the customer's shard.&lt;/p&gt;

&lt;p&gt;A query 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;Find the top 100 orders across all customers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may now require:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             Application
                  │
       ┌──────────┼──────────┐
       ▼          ▼          ▼
    Shard 1    Shard 2    Shard 3
       │          │          │
       └──────────┼──────────┘
                  ▼
             Merge Results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Distributed transactions, cross-shard joins, rebalancing, and operational tooling all become more complicated.&lt;/p&gt;

&lt;p&gt;For that reason, sharding should generally be introduced because measurements demonstrate that simpler approaches cannot meet the required capacity—not simply because the system is getting large.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Decouple Non-Critical Work With Events
&lt;/h1&gt;

&lt;p&gt;Another way to reduce database pressure is to remove unnecessary synchronous work.&lt;/p&gt;

&lt;p&gt;Consider order creation.&lt;/p&gt;

&lt;p&gt;The customer-critical operation might be:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;But several other actions may follow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Send email
Generate invoice
Update analytics
Notify warehouse
Update recommendations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Doing everything synchronously creates a long request path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API
 │
 ├── Database
 ├── Email
 ├── Invoice
 ├── Analytics
 └── Warehouse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An event-driven architecture can separate those responsibilities:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                API
                 │
                 ▼
            Order Database
                 │
                 ▼
              Event Bus
          ┌──────┼───────┐
          ▼      ▼       ▼
        Email  Invoice  Analytics
                         │
                         ▼
                      Warehouse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The customer request completes once the critical transaction succeeds.&lt;/p&gt;

&lt;p&gt;Other workloads can be processed asynchronously.&lt;/p&gt;

&lt;p&gt;This improves resilience as well as database efficiency because temporary downstream problems do not necessarily block the primary transaction.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. CQRS and Specialized Read Models
&lt;/h1&gt;

&lt;p&gt;For systems with extremely different read and write requirements, &lt;strong&gt;Command Query Responsibility Segregation (CQRS)&lt;/strong&gt; takes this idea further.&lt;/p&gt;

&lt;p&gt;Instead of forcing one data model to serve every use case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                Application
                     │
              ┌──────┴──────┐
              ▼             ▼
           Commands       Queries
              │             │
              ▼             ▼
         Write Model     Read Model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The write model can be optimized for transactional correctness.&lt;/p&gt;

&lt;p&gt;The read model can be shaped around how users actually query the data.&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;Order Service
     │
     ├── Write → Relational Database
     │
     └── Read  → Optimized Read Model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The read model might use a relational replica, cache, search engine, or another specialized datastore depending on the requirements.&lt;/p&gt;

&lt;p&gt;CQRS is powerful, but it also introduces synchronization and consistency concerns.&lt;/p&gt;

&lt;p&gt;It should therefore solve a demonstrated workload problem rather than become architectural decoration.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Kubernetes Doesn't Automatically Solve Database Scaling
&lt;/h1&gt;

&lt;p&gt;This distinction is especially important in cloud-native environments.&lt;/p&gt;

&lt;p&gt;Kubernetes makes it easy to scale stateless services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deployment
    │
    ├── Pod
    ├── Pod
    ├── Pod
    └── Pod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But databases have state.&lt;/p&gt;

&lt;p&gt;They require careful handling of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;persistent storage&lt;/li&gt;
&lt;li&gt;replication&lt;/li&gt;
&lt;li&gt;failover&lt;/li&gt;
&lt;li&gt;consistency&lt;/li&gt;
&lt;li&gt;backups&lt;/li&gt;
&lt;li&gt;recovery&lt;/li&gt;
&lt;li&gt;leader election&lt;/li&gt;
&lt;li&gt;data distribution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adding more application pods can actually increase database pressure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             10 API Pods
                  │
                  ▼
             Database
                  ▲
                  │
             50 API Pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the database is already saturated, scaling the application from 10 to 50 pods may simply create more concurrent database requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autoscaling the application does not automatically mean the data layer can scale with it.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  12. Capacity Planning: Know When the Architecture Will Break
&lt;/h1&gt;

&lt;p&gt;Database scaling should ideally happen before an outage forces the decision.&lt;/p&gt;

&lt;p&gt;Suppose current capacity is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20,000 queries/sec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and traffic grows by 20% per year.&lt;/p&gt;

&lt;p&gt;Without intervention, the system eventually approaches its capacity ceiling:&lt;br&gt;
&lt;/p&gt;

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

40k |                         /
35k |                       /
30k |                    /
25k |                 /
20k |--------------/---------- Capacity
15k |           /
10k |       /
 5k |    /
    +----------------------------
       Time →
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Capacity planning combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;historical traffic&lt;/li&gt;
&lt;li&gt;expected growth&lt;/li&gt;
&lt;li&gt;seasonal peaks&lt;/li&gt;
&lt;li&gt;business projections&lt;/li&gt;
&lt;li&gt;resource utilization&lt;/li&gt;
&lt;li&gt;query volume&lt;/li&gt;
&lt;li&gt;storage growth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to predict the exact future.&lt;/p&gt;

&lt;p&gt;It is to identify architectural limits early enough to act before the system reaches them.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. Protect the Database With SLOs
&lt;/h1&gt;

&lt;p&gt;Database performance should ultimately be connected to user-facing objectives.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;"The database should be fast."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;define measurable targets.&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;Order API

Availability       99.95%
P95 latency        &amp;lt; 300 ms
P99 latency        &amp;lt; 800 ms
Replication lag    &amp;lt; 5 sec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These targets provide a basis for evaluating architectural changes.&lt;/p&gt;

&lt;p&gt;If a new cache reduces database CPU but causes unacceptable stale data, the trade-off becomes visible.&lt;/p&gt;

&lt;p&gt;If read replicas increase throughput but replication lag violates the application's consistency requirements, that matters too.&lt;/p&gt;

&lt;p&gt;Scaling decisions should therefore be driven by &lt;strong&gt;service requirements&lt;/strong&gt;, not infrastructure metrics alone.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. Backups and Recovery Are Part of Scaling
&lt;/h1&gt;

&lt;p&gt;A highly available database is not automatically a recoverable database.&lt;/p&gt;

&lt;p&gt;A production data strategy should account for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    Database
                       │
          ┌────────────┼────────────┐
          ▼            ▼            ▼
       Backups       Replicas      Archive
          │            │            │
          ▼            ▼            ▼
      Recovery       Failover    Retention
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important considerations include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recovery Point Objective (RPO)&lt;/li&gt;
&lt;li&gt;Recovery Time Objective (RTO)&lt;/li&gt;
&lt;li&gt;automated backups&lt;/li&gt;
&lt;li&gt;point-in-time recovery&lt;/li&gt;
&lt;li&gt;replication&lt;/li&gt;
&lt;li&gt;failover&lt;/li&gt;
&lt;li&gt;restore testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A backup strategy should be tested regularly.&lt;/p&gt;

&lt;p&gt;A backup that cannot be restored when needed is not a reliable disaster-recovery mechanism.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. A Practical Scaling Path
&lt;/h1&gt;

&lt;p&gt;There is no universal sequence for every system, but a useful decision model is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  Database Problem
                         │
                         ▼
                  Measure the Cause
                         │
             ┌───────────┴───────────┐
             ▼                       ▼
        Query / Workload       Capacity Limit
             │                       │
             ▼                       ▼
        Optimize Work            Add Capacity
             │                       │
      ┌──────┼──────┐          ┌─────┼─────┐
      ▼      ▼      ▼          ▼     ▼     ▼
   Index   Cache   Pool      Replicas Partition Sharding
      │      │      │
      └──────┴──────┘
             │
             ▼
       Re-measure
             │
             ▼
      Still insufficient?
             │
             ▼
      Re-architect workload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is the feedback loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Measure
   ↓
Change
   ↓
Observe
   ↓
Measure again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each architectural change should have a measurable reason behind it.&lt;/p&gt;




&lt;h1&gt;
  
  
  16. The Mature Data Architecture
&lt;/h1&gt;

&lt;p&gt;A large production system may eventually look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                           Users
                             │
                             ▼
                       ┌───────────┐
                       │ API Layer │
                       └─────┬─────┘
                             │
             ┌───────────────┼────────────────┐
             │               │                │
             ▼               ▼                ▼
          Cache           Search            Queue
             │               │                │
             │               │                ▼
             │               │             Workers
             │               │                │
             │               │                ▼
             │               │             Database
             │               │                │
             │               │        ┌───────┼───────┐
             │               │        ▼       ▼       ▼
             │               │     Replica Replica Replica
             │               │
             │               └── Specialized search
             │
             └── Frequently accessed data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behind the scenes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                   Primary Database
                          │
                 ┌────────┴────────┐
                 ▼                 ▼
                CDC              Backup
                 │                 │
                 ▼                 ▼
          Analytics Platform    Object Storage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each component has a specific responsibility.&lt;/p&gt;

&lt;p&gt;The transactional database is no longer expected to handle every type of workload.&lt;/p&gt;




&lt;h1&gt;
  
  
  17. The Real Lesson
&lt;/h1&gt;

&lt;p&gt;Database scaling is not simply a matter of buying a larger machine.&lt;/p&gt;

&lt;p&gt;It is about understanding &lt;strong&gt;where the work is coming from and deciding which work should happen where&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A useful progression is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Understand
    ↓
Optimize
    ↓
Control
    ↓
Cache
    ↓
Replicate
    ↓
Separate
    ↓
Partition
    ↓
Shard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But this is not a checklist where every system must eventually reach the final step.&lt;/p&gt;

&lt;p&gt;A small system may only need good indexes and connection pooling.&lt;/p&gt;

&lt;p&gt;A read-heavy application may benefit greatly from replicas and caching.&lt;/p&gt;

&lt;p&gt;A large analytics platform may need to separate transactional and analytical workloads.&lt;/p&gt;

&lt;p&gt;A globally distributed platform may eventually require sharding or a distributed database.&lt;/p&gt;

&lt;p&gt;The correct architecture depends on the workload.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;When an application grows, the database often becomes the hidden constraint behind everything else.&lt;/p&gt;

&lt;p&gt;The API can scale.&lt;/p&gt;

&lt;p&gt;Kubernetes can scale.&lt;/p&gt;

&lt;p&gt;Load balancers can scale.&lt;/p&gt;

&lt;p&gt;But if every request ultimately depends on a database that cannot keep up, the entire system eventually reaches the same wall.&lt;/p&gt;

&lt;p&gt;The solution is not to immediately introduce more databases.&lt;/p&gt;

&lt;p&gt;It is to progressively remove unnecessary work, control concurrency, cache repeated reads, distribute appropriate workloads, and only introduce more complex data architectures when the measurements justify them.&lt;/p&gt;

&lt;p&gt;The most important progression is therefore:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;measure → optimize → isolate → distribute → scale.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And throughout the process, keep asking one question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What work is the database doing that it doesn't actually need to do?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question often leads to a simpler and more scalable architecture than simply throwing more hardware at the problem.&lt;/p&gt;

&lt;p&gt;At scale, database performance is no longer just a database concern.&lt;/p&gt;

&lt;p&gt;It becomes an &lt;strong&gt;architecture, reliability, and workload-management problem&lt;/strong&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Spooky Haunted House: CSS &amp; JS Halloween Art</title>
      <dc:creator>Gilbert Ngeno</dc:creator>
      <pubDate>Wed, 29 Oct 2025 11:06:47 +0000</pubDate>
      <link>https://dev.to/gilly7/spooky-haunted-house-css-js-halloween-art-1i21</link>
      <guid>https://dev.to/gilly7/spooky-haunted-house-css-js-halloween-art-1i21</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2025-10-15"&gt;Frontend Challenge - Halloween Edition, CSS Art&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;I was inspired by classic haunted house scenes from Halloween movies and stories. My CSS art features a spooky haunted house, glowing moon, flickering windows, bats, ghosts, zombies, pumpkins, and interactive elements like thunder, fog, and falling leaves—all designed to evoke the playful yet eerie spirit of Halloween night.&lt;/p&gt;

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

&lt;p&gt;You can view the live demo here:&lt;br&gt;
&lt;a href="https://halloweenchallenge.netlify.app/" rel="noopener noreferrer"&gt;Halloween Haunted House Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/gilly7/Halloween-Challenge" rel="noopener noreferrer"&gt;Github repo&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%2Fq1bpself27trs5cej527.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%2Fq1bpself27trs5cej527.png" alt=" " width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;This project was a fun exploration of CSS art and interactive frontend features. I learned how to combine CSS animations with JavaScript to create dynamic effects, such as flickering lights, moving zombies, and sound triggers for thunder, witch cackles, and more. &lt;br&gt;
I’m proud of the way the scene comes alive with user interaction—hovering, clicking, and toggling music and themes. Next, I’d like to add more accessibility features and polish the mobile responsiveness.&lt;/p&gt;

&lt;p&gt;If you’d like to use or remix this, feel free—credit me!&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
    </item>
    <item>
      <title>Part 2: Deploying Your FastAPI and React.js CRUD App on Render.com</title>
      <dc:creator>Gilbert Ngeno</dc:creator>
      <pubDate>Wed, 03 Sep 2025 21:10:47 +0000</pubDate>
      <link>https://dev.to/gilly7/part-2-deploying-your-fastapi-and-reactjs-crud-app-on-rendercom-3l50</link>
      <guid>https://dev.to/gilly7/part-2-deploying-your-fastapi-and-reactjs-crud-app-on-rendercom-3l50</guid>
      <description>&lt;p&gt;In &lt;a href="https://dev.to/gilly7/building-your-first-full-stack-crud-app-with-fastapi-and-reactjs-3i1n"&gt;Part 1&lt;/a&gt;, we built a full-stack CRUD (Create, Read, Update, Delete) application using FastAPI for the backend and React.js for the frontend. Now, let’s make it live on Render.com, a free and beginner-friendly platform! &lt;br&gt;
This guide will walk you through deploying the FastAPI backend as a Web Service and the React frontend as a Static Site. &lt;br&gt;
We’ll also fix common errors (like CORS and import issues) and share best practices to ensure a smooth deployment.&lt;/p&gt;

&lt;p&gt;This article is for absolute beginners. We assume you’ve completed the tutorial, have your project in a Git repository (e.g., GitHub), and are ready to deploy. &lt;br&gt;
Don’t worry—we’ll explain every step clearly!&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;br&gt;
Before starting, ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Render.com account (sign up at &lt;a href="//render.com"&gt;render.com&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Your project pushed to a Git repository (GitHub, GitLab, or Bitbucket).
Your project structure should look like:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-crud-app/
├── backend/
│   ├── main.py
│   ├── models.py
│   ├── schemas.py
│   ├── database.py
│   ├── requirements.txt
├── frontend/
│   ├── src/
│   │   ├── App.js
│   │   ├── App.css
│   ├── package.json
│   ├── public/

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Basic Git commands (e.g., git add, git commit, git push).&lt;br&gt;
The backend dependencies listed in requirements.txt (see below).&lt;/p&gt;

&lt;p&gt;If you don’t have requirements.txt, create it in backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backend
pip &lt;span class="nb"&gt;install &lt;/span&gt;fastapi uvicorn sqlalchemy databases aiosqlite python-dotenv
pip freeze &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This generates a file like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fastapi==0.111.1
uvicorn==0.30.6
sqlalchemy==2.0.31
databases==0.9.0
aiosqlite==0.20.0
python-dotenv==1.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Step 1: Deploy the FastAPI Backend as a Web Service&lt;/strong&gt;&lt;br&gt;
The backend is the server that handles CRUD operations (e.g., storing items in a database). &lt;br&gt;
Render’s &lt;strong&gt;Web Service&lt;/strong&gt; runs your FastAPI app.&lt;br&gt;
&lt;strong&gt;1.1 Prepare the Backend&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Fix Imports in main.py:&lt;/strong&gt;&lt;br&gt;
The tutorial uses relative imports (&lt;strong&gt;&lt;em&gt;from . import models, schemas, database&lt;/em&gt;&lt;/strong&gt;), which can cause errors on Render like &lt;em&gt;&lt;strong&gt;“ImportError: attempted relative import with no known parent package.”&lt;/strong&gt;&lt;/em&gt; You have two options to fix this:&lt;br&gt;
&lt;strong&gt;Option 1: Use Absolute Imports with backend:&lt;/strong&gt;&lt;br&gt;
Change the import line in backend/main.py:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;backend&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schemas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This assumes backend/ is your module name.&lt;/p&gt;

&lt;p&gt;Option 2: Use &lt;strong&gt;init&lt;/strong&gt;.py for Package Structure:&lt;br&gt;
Create an empty &lt;strong&gt;init&lt;/strong&gt;.py file in backend/ to make it a Python package:bash&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backend
&lt;span class="nb"&gt;touch &lt;/span&gt;__init__.py  &lt;span class="c"&gt;# macOS/Linux (or echo. &amp;gt; __init__.py on Windows)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the relative import in main.py:python&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schemas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add an environment variable in Render (see Step 1.2) to set PYTHONPATH.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: &lt;strong&gt;Use Option 1&lt;/strong&gt; (absolute imports) for simplicity—it works without extra files or environment variables.&lt;br&gt;
If you prefer Option 2, we’ll configure it below.&lt;/p&gt;

&lt;p&gt;Commit changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;backend
git add main.py  &lt;span class="c"&gt;# And __init__.py if using Option 2&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Fix imports for deployment"&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify requirements.txt:&lt;br&gt;
Confirm it includes all dependencies (listed above). If missing, regenerate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;backend
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate  &lt;span class="c"&gt;# macOS/Linux (or .\venv\Scripts\activate on Windows)&lt;/span&gt;
pip freeze &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; requirements.txt
git add requirements.txt
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add requirements.txt"&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Test Locally&lt;/strong&gt;:&lt;br&gt;
Run the backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
uvicorn main:app &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit &lt;a href="http://localhost:8000/docs" rel="noopener noreferrer"&gt;http://localhost:8000/docs&lt;/a&gt; to see the FastAPI Swagger UI.&lt;br&gt;
Test POST /items/ with a sample item: {"name": "Test", "description": "Test item"}. If using Option 2, set:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PYTHONPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;  &lt;span class="c"&gt;# macOS/Linux (or set PYTHONPATH=%CD% on Windows)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;1.2 Deploy on Render&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(1). &lt;strong&gt;Create a Web Service&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Log in to &lt;a href="//Render.com"&gt;Render.com&lt;/a&gt;&lt;br&gt;
Click &lt;strong&gt;New &amp;gt; Web Service&lt;/strong&gt;.&lt;br&gt;
Connect your Git repository (containing backend/ and frontend/).&lt;br&gt;
Set Root Directory to backend/ (if in a monorepo).&lt;/p&gt;

&lt;p&gt;(2). Configure Settings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: e.g., my-crud-api.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment&lt;/strong&gt;: Python 3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branch&lt;/strong&gt;: main.&lt;/li&gt;
&lt;li&gt;**Build **Command: pip install -r requirements.txt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start Command&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;For Option 1 (absolute imports): uvicorn main:app --host 0.0.0.0 --port $PORT.&lt;/li&gt;
&lt;li&gt;For Option 2 (init.py): uvicorn backend.main:app --host 0.0.0.0 --port $PORT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instance Type&lt;/strong&gt;: Free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment Variables&lt;/strong&gt; (for Option 2 only):
Key: PYTHONPATH
Value: /opt/render/project/src/backend&lt;/li&gt;
&lt;li&gt;If using a database other than SQLite, add **DATABASE_URL **later (Step 4).&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Deploy:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Create Web Service&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Check Logs for errors (e.g., missing dependencies or import issues).&lt;/li&gt;
&lt;li&gt;Get the URL (e.g., &lt;a href="https://my-crud-api.onrender.com" rel="noopener noreferrer"&gt;https://my-crud-api.onrender.com&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Visit /docs to confirm the API is live.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Deploy the React Frontend as a Static Site&lt;/strong&gt;&lt;br&gt;
The frontend is your React app, served as static files after building. Render’s Static Site hosting is ideal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.1 Prepare the Frontend&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update API Base URL&lt;/strong&gt;:&lt;br&gt;
In frontend/src/App.js, use an environment variable to avoid hardcoding the backend URL:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REACT_APP_API_URL&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:8000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;+$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The .replace(/\/+$/, '') prevents double slashes (e.g., //items/).&lt;/li&gt;
&lt;li&gt;Update Axios calls to use /items (no trailing slash):javascript
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/items`&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/items`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
git add src/App.js
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Update API base URL"&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test Locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;REACT_APP_API_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://my-crud-api.onrender.com  &lt;span class="c"&gt;# Your backend URL&lt;/span&gt;
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;strong&gt;&lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;/strong&gt;, create an item, and check the Network tab (F12) to ensure requests go to &lt;strong&gt;&lt;a href="https://my-crud-api.onrender.com/items" rel="noopener noreferrer"&gt;https://my-crud-api.onrender.com/items&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;2.2 Deploy on Render&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Static Site&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the same Render project, click New &amp;gt; Static Site.&lt;/li&gt;
&lt;li&gt;Connect the same Git repository.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Root Directory&lt;/strong&gt; to ** frontend/.**&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Configure Settings&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: e.g., my-crud-frontend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branch&lt;/strong&gt;: main.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Command&lt;/strong&gt;: npm install &amp;amp;&amp;amp; npm run build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish Directory&lt;/strong&gt;: build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment Variables&lt;/strong&gt;:
Key: REACT_APP_API_URL
Value: &lt;a href="https://my-crud-api.onrender.com" rel="noopener noreferrer"&gt;https://my-crud-api.onrender.com&lt;/a&gt; (no trailing slash).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Create Static Site&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Check build logs for errors (e.g., missing react-scripts in package.json).&lt;/li&gt;
&lt;li&gt;Get the URL (e.g., &lt;a href="https://my-crud-frontend.onrender.com" rel="noopener noreferrer"&gt;https://my-crud-frontend.onrender.com&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Fix CORS for Frontend-Backend Communication&lt;/strong&gt;&lt;br&gt;
Since the frontend and backend are on different domains, the backend must allow the frontend’s domain via CORS.&lt;/p&gt;

&lt;p&gt;(1). &lt;br&gt;
&lt;strong&gt;Update main.py&lt;/strong&gt;:&lt;br&gt;
In backend/main.py, add the frontend URL to CORS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CORSMiddleware&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allow_origins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://my-crud-frontend.onrender.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# Your frontend URL
&lt;/span&gt;    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;allow_credentials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allow_methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;allow_headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&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;p&gt;(2). &lt;br&gt;
&lt;strong&gt;Redeploy Backend:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;backend
git add main.py
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add frontend URL to CORS"&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Redeploy in Render if auto-deploy is off.&lt;/p&gt;

&lt;p&gt;(3). &lt;br&gt;
&lt;strong&gt;Test CORS:&lt;/strong&gt;&lt;br&gt;
Visit &lt;a href="https://my-crud-frontend.onrender.com" rel="noopener noreferrer"&gt;https://my-crud-frontend.onrender.com&lt;/a&gt;.&lt;br&gt;
In Developer Tools (F12) &amp;gt; Network tab, check that POST /items succeeds (201 Created).&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Handle Database Persistence&lt;/strong&gt;&lt;br&gt;
The tutorial uses SQLite, which loses data on Render due to its &lt;strong&gt;ephemeral filesystem&lt;/strong&gt;. Use Render’s PostgreSQL for production.&lt;/p&gt;

&lt;p&gt;(1). &lt;strong&gt;Create a PostgreSQL Database&lt;/strong&gt;:&lt;br&gt;
In Render, click &lt;strong&gt;New &amp;gt; PostgreSQL&lt;/strong&gt;.&lt;br&gt;
Set a name (e.g., my-crud-db) and create.&lt;br&gt;
Copy the Internal Database URL from the Info tab.&lt;/p&gt;

&lt;p&gt;(2). Update Backend:&lt;br&gt;
In backend/database.py:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_engine&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="n"&gt;DATABASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sqlite:///./sql_app.db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add to requirements.txt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;psycopg2-binary==2.9.9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Render Web Service, add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Key: DATABASE_URL&lt;/li&gt;
&lt;li&gt;Value: &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Redeploy backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resolving Common Error&lt;/strong&gt;s&lt;br&gt;
Here are beginner-friendly fixes for issues you might face.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error 1: CORS Policy Blocks Requests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Symptoms&lt;/strong&gt;: Browser console shows: “Access to XMLHttpRequest at ‘&lt;a href="https://my-crud-api.onrender.com/items%E2%80%99" rel="noopener noreferrer"&gt;https://my-crud-api.onrender.com/items’&lt;/a&gt; from origin ‘&lt;a href="https://my-crud-frontend.onrender.com%E2%80%99" rel="noopener noreferrer"&gt;https://my-crud-frontend.onrender.com’&lt;/a&gt; has been blocked by CORS policy.”&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Add the frontend URL to allow_origins in main.py.&lt;/li&gt;
&lt;li&gt;Test with allow_origins=["*"] temporarily, then revert to specific domains.&lt;/li&gt;
&lt;li&gt;Redeploy backend and check Network tab.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Error 2: Double Slash in URL (e.g., //items/)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Symptoms&lt;/strong&gt;: Requests fail with 404 due to &lt;a href="https://my-crud-api.onrender.com//items/" rel="noopener noreferrer"&gt;https://my-crud-api.onrender.com//items/&lt;/a&gt;.&lt;br&gt;
&lt;strong&gt;Fix&lt;/strong&gt;:Ensure App.js strips trailing slashes:javascript&lt;/p&gt;

&lt;p&gt;const API_BASE = (process.env.REACT_APP_API_URL || '&lt;a href="http://localhost:8000').replace(/%5C/+$/" rel="noopener noreferrer"&gt;http://localhost:8000').replace(/\/+$/&lt;/a&gt;, '');&lt;/p&gt;

&lt;p&gt;Set REACT_APP_API_URL without a trailing slash in Render.&lt;br&gt;
Redeploy frontend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error 3: Backend Import Error&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Symptoms&lt;/strong&gt;: Render logs show “ImportError: attempted relative import with no known parent package.”&lt;br&gt;
&lt;strong&gt;Fix&lt;/strong&gt;:&lt;br&gt;
Use &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Option 1&lt;/strong&gt;: Change to from backend import models, schemas, database.
Or&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Option 2&lt;/strong&gt;: Add &lt;strong&gt;init&lt;/strong&gt;.py to backend/ and set PYTHONPATH=/opt/render/project/src/backend in Render.&lt;/li&gt;
&lt;li&gt;Redeploy backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Error 4&lt;/strong&gt;: Data Resets on Redeploy&lt;br&gt;
&lt;strong&gt;Symptoms&lt;/strong&gt;: Items disappear after redeploying.&lt;br&gt;
&lt;strong&gt;Fix&lt;/strong&gt;: Use PostgreSQL (Step 4) instead of SQLite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error 5: Slow Backend Response&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Symptoms&lt;/strong&gt;: First request takes 10-30 seconds.&lt;br&gt;
Fix: Normal for Render’s free tier. Upgrade to paid (~$7/month) for always-on, or warn users of delays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Practices for Beginners&lt;/strong&gt;&lt;br&gt;
(1). &lt;strong&gt;Use Environment Variables&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Store URLs (e.g., REACT_APP_API_URL) in Render’s environment variables.&lt;/p&gt;

&lt;p&gt;(2). &lt;strong&gt;Test Locally&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run backend (uvicorn main:app) and frontend (npm start) with deployed URLs.&lt;/li&gt;
&lt;li&gt;Check Network tab (F12) for errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(3). Check Logs:&lt;br&gt;
Use Render’s Logs tab to debug build or runtime issues.&lt;/p&gt;

&lt;p&gt;(4). Validate Inputs:&lt;br&gt;
Prevent empty form submissions:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Name and description are required&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="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// ... Axios POST&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(5). Version Control:&lt;br&gt;
Commit with clear messages: git commit -m "Fix CORS".&lt;/p&gt;

&lt;p&gt;(6). Secure CORS:&lt;br&gt;
Only allow specific origins (not ["*"]) in production.&lt;/p&gt;

&lt;p&gt;(7). Monitor Performance:&lt;/p&gt;

&lt;p&gt;Consider paid tiers for faster responses.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Testing Your Deployed App&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visit &lt;a href="https://my-crud-frontend.onrender.com" rel="noopener noreferrer"&gt;https://my-crud-frontend.onrender.com&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Test CRUD operations:Create, read, update, delete items.&lt;/li&gt;
&lt;li&gt;Check Network tab (F12) for request success (200/201 status).&lt;/li&gt;
&lt;li&gt;Debug errors using Render logs and browser console.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Congratulations!Your full-stack CRUD app is live on Render! You’ve deployed the FastAPI backend and React frontend, fixed common issues, and learned best practices. Share your app’s URL and explore adding features like custom domains or user authentication.&lt;/p&gt;

&lt;p&gt;If you need help, check Render’s docs or comment below. Happy deploying!&lt;/p&gt;

</description>
      <category>render</category>
      <category>fastapi</category>
      <category>react</category>
      <category>swagger</category>
    </item>
    <item>
      <title>Part 1: Building Your First Full-Stack CRUD App with FastAPI and React.js</title>
      <dc:creator>Gilbert Ngeno</dc:creator>
      <pubDate>Wed, 03 Sep 2025 09:01:21 +0000</pubDate>
      <link>https://dev.to/gilly7/building-your-first-full-stack-crud-app-with-fastapi-and-reactjs-3i1n</link>
      <guid>https://dev.to/gilly7/building-your-first-full-stack-crud-app-with-fastapi-and-reactjs-3i1n</guid>
      <description>&lt;p&gt;&lt;strong&gt;A Beginner's Guide to Creating, Connecting, and Deploying a Web Application&lt;/strong&gt;&lt;br&gt;
Have you ever wondered how web applications work behind the scenes? How data gets created, displayed, updated, and deleted? In this tutorial, I'll guide you through building a complete CRUD (Create, Read, Update, Delete) application using FastAPI for the backend and React.js for the frontend. We'll even deploy it to the internet so you can share it with others!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What You'll Build&lt;/strong&gt;&lt;br&gt;
You'll create a simple item management system where you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add new items with names and descriptions&lt;/li&gt;
&lt;li&gt;View all items in a list&lt;/li&gt;
&lt;li&gt;Edit existing items&lt;/li&gt;
&lt;li&gt;Delete items you no longer need&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;br&gt;
Before we start, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic knowledge of Python and JavaScript&lt;/li&gt;
&lt;li&gt;Python 3.7+ installed on your computer&lt;/li&gt;
&lt;li&gt;Node.js and npm installed&lt;/li&gt;
&lt;li&gt;A text editor (VS Code recommended)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Part 1: Setting Up the Backend with FastAPI&lt;/strong&gt;&lt;br&gt;
FastAPI is a modern, fast web framework for building APIs with Python. It's perfect for beginners because it provides automatic interactive documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-by-Step Backend Setup&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create Project Structure&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open your terminal and run these commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a main project directory&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;crud-app
&lt;span class="c"&gt;# Move into the directory&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;crud-app
&lt;span class="c"&gt;# Create a virtual environment (isolated Python environment)&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;mkdir creates a new directory/folder&lt;/p&gt;

&lt;p&gt;cd changes your current directory&lt;/p&gt;

&lt;p&gt;python -m venv venv creates a virtual environment named "venv" that keeps your project's dependencies separate from other Python projects&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Activate Virtual Environment
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On macOS/Linux:&lt;/span&gt;
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
&lt;span class="c"&gt;# On Windows:&lt;/span&gt;
venv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;:&lt;br&gt;
Activating the virtual environment ensures that any packages we install are only available for this specific project. You'll know it's activated when you see (venv) at the beginning of your terminal prompt.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Required Packages
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;fastapi uvicorn sqlalchemy aiosqlite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;fastapi: The main web framework&lt;/p&gt;

&lt;p&gt;uvicorn: A server that will run our FastAPI application&lt;/p&gt;

&lt;p&gt;sqlalchemy: A database toolkit that helps us work with databases&lt;/p&gt;

&lt;p&gt;aiosqlite: Allows async database operations with SQLite&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create Backend Files&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create a backend directory and these files inside it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;crud-app/
├── backend/
│   ├── main.py
│   ├── database.py
│   ├── models.py
│   └── schemas.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Set Up the Database (database.py)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_engine&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy.ext.declarative&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;declarative_base&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy.orm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sessionmaker&lt;/span&gt;

&lt;span class="c1"&gt;# Database URL for SQLite (it will create a file called test.db)
&lt;/span&gt;&lt;span class="n"&gt;SQLALCHEMY_DATABASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sqlite:///./test.db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Create the database engine
&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_engine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;SQLALCHEMY_DATABASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connect_args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_same_thread&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create a SessionLocal class for database sessions
&lt;/span&gt;&lt;span class="n"&gt;SessionLocal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sessionmaker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;autocommit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;autoflush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create a Base class for our models
&lt;/span&gt;&lt;span class="n"&gt;Base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;declarative_base&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;We're using SQLite, a simple file-based database, for simplicity&lt;/p&gt;

&lt;p&gt;The engine is responsible for connecting to the database&lt;/p&gt;

&lt;p&gt;SessionLocal will be used to create database sessions&lt;/p&gt;

&lt;p&gt;Base is a class that our models will inherit from&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create the Item Model (models.py)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Base&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;__tablename__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;primary_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;We're creating a table called "items" with three columns&lt;/p&gt;

&lt;p&gt;id is our primary key (unique identifier for each item)&lt;/p&gt;

&lt;p&gt;name and description will store text data&lt;/p&gt;

&lt;p&gt;index=True makes searching faster for these columns&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create Pydantic Schemas (schemas.py)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;

&lt;span class="c1"&gt;# Base schema with common attributes
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ItemBase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="c1"&gt;# Schema for creating a new item
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ItemCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ItemBase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c1"&gt;# Schema for reading/returning an item (includes id)
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ItemBase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;

    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;orm_mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;Schemas define the structure of our data when sending/receiving from the API&lt;/p&gt;

&lt;p&gt;ItemCreate is used when creating a new item (doesn't need an ID yet)&lt;/p&gt;

&lt;p&gt;Item is used when returning data (includes the ID)&lt;/p&gt;

&lt;p&gt;orm_mode = True allows converting from database models to Pydantic models&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create the Main FastAPI App (main.py)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Depends&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HTTPException&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sqlalchemy.orm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schemas&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SessionLocal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi.middleware.cors&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CORSMiddleware&lt;/span&gt;

&lt;span class="c1"&gt;# Create all tables in the database
&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create the FastAPI application
&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Add CORS middleware to allow React frontend to connect
&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;CORSMiddleware&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allow_origins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:3000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="c1"&gt;# React's default port
&lt;/span&gt;    &lt;span class="n"&gt;allow_credentials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allow_methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="c1"&gt;# Allow all HTTP methods
&lt;/span&gt;    &lt;span class="n"&gt;allow_headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="c1"&gt;# Allow all headers
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Dependency to get database session
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_db&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SessionLocal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;
    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# CREATE - Add a new item
&lt;/span&gt;&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/items/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;schemas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;schemas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ItemCreate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Depends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_db&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;db_item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;refresh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;db_item&lt;/span&gt;

&lt;span class="c1"&gt;# READ - Get all items
&lt;/span&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/items/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;schemas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Depends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_db&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skip&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;

&lt;span class="c1"&gt;# READ - Get a single item by ID
&lt;/span&gt;&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/items/{item_id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;schemas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Depends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_db&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Item not found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;

&lt;span class="c1"&gt;# UPDATE - Update an existing item
&lt;/span&gt;&lt;span class="nd"&gt;@app.put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/items/{item_id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;schemas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;schemas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ItemCreate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Depends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_db&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;db_item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;db_item&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Item not found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nf"&gt;setattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db_item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;refresh&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;db_item&lt;/span&gt;

&lt;span class="c1"&gt;# DELETE - Remove an item
&lt;/span&gt;&lt;span class="nd"&gt;@app.delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/items/{item_id}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Depends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_db&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Item not found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Item deleted successfully&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;We create endpoints for all CRUD operations (Create, Read, Update, Delete)&lt;/p&gt;

&lt;p&gt;Each endpoint has a specific HTTP method (@app.post, @app.get, etc.)&lt;/p&gt;

&lt;p&gt;The response_model parameter ensures our responses match the expected schema&lt;/p&gt;

&lt;p&gt;Depends(get_db) provides a database session for each request&lt;/p&gt;

&lt;p&gt;CORS middleware allows our React frontend to communicate with the backend&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the Backend Server
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backend
uvicorn main:app &lt;span class="nt"&gt;--reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;uvicorn is the server that runs our FastAPI application&lt;/p&gt;

&lt;p&gt;main:app tells uvicorn to look for the app object in the main.py file&lt;/p&gt;

&lt;p&gt;--reload enables automatic reloading when we make code changes&lt;/p&gt;

&lt;p&gt;Your API is now running at &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;! Visit &lt;a href="http://localhost:8000/docs" rel="noopener noreferrer"&gt;http://localhost:8000/docs&lt;/a&gt; to see the interactive documentation automatically generated by FastAPI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2: Building the Frontend with React.js&lt;/strong&gt;&lt;br&gt;
React is a popular JavaScript library for building user interfaces. We'll create a simple interface to interact with our backend API.&lt;/p&gt;

&lt;p&gt;Step-by-Step Frontend Setup&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create React App&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;From the project root directory, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a new React application called "frontend"&lt;/span&gt;
npx create-react-app frontend
&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;npx runs commands from npm packages without installing them globally&lt;/p&gt;

&lt;p&gt;create-react-app is a tool that sets up a modern React application with all the necessary configuration&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Axios for API Calls
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;axios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;Axios is a library that makes it easier to send HTTP requests to our backend API&lt;/p&gt;

&lt;p&gt;React doesn't have built-in HTTP request capabilities, so we need a library like Axios&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Replace the Contents of App.js&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open src/App.js and replace its contents with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Base URL for our backend API&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:8000&lt;/span&gt;&lt;span class="dl"&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;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// State variables to manage our data&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setItems&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;editingId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEditingId&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// useEffect hook runs when the component mounts&lt;/span&gt;
  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;fetchItems&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="c1"&gt;// Function to fetch all items from the backend&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchItems&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/items/`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error fetching items:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// Function to create a new item&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/items/`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;description&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nf"&gt;setItems&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
      &lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&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;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error creating item:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// Function to update an existing item&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;updateItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&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;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/items/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;editingId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;description&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nf"&gt;setItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;editingId&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="nf"&gt;setEditingId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&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;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error updating item:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// Function to delete an item&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deleteItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;API_BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/items/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;setItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error deleting item:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// Function to start editing an item&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;startEdit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setEditingId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// Function to cancel editing&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cancelEdit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setEditingId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&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="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"App"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;CRUD App with FastAPI and React&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"item-form"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;editingId&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Edit Item&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="s1"&gt;Add New Item&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
          &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Name"&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
          &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Description"&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setDescription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;editingId&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;updateItem&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Update&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;cancelEdit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Cancel&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;createItem&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Create&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"items-list"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Items&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;No items found&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;startEdit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Edit&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;deleteItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Delete&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;We use React hooks (useState, useEffect) to manage state and side effects&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;API_BASE *&lt;/em&gt; points to our backend server&lt;/p&gt;

&lt;p&gt;Each function makes an API call using Axios and updates the UI accordingly&lt;/p&gt;

&lt;p&gt;The form changes between "Create" and "Edit" mode based on whether we're editing an existing item&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update the CSS (App.css)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Replace the contents of src/App.css with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.App&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Arial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.item-form&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f9f9f9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.item-form&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ddd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.item-form&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;15px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#4CAF50&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.item-form&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#45a049&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.items-list&lt;/span&gt; &lt;span class="nt"&gt;ul&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;list-style-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.items-list&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#eee&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.items-list&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.items-list&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:first-child&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#2196F3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.items-list&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:last-child&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f44336&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.items-list&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.8&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;ol&gt;
&lt;li&gt;Run the React Application
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your React app will open at &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;. You should now be able to add, view, edit, and delete items!&lt;/p&gt;

&lt;p&gt;Part 3: Connecting Backend and Frontend&lt;br&gt;
The magic happens through HTTP requests between the frontend and backend:&lt;/p&gt;

&lt;p&gt;Frontend (React): Makes requests using Axios to specific URLs&lt;/p&gt;

&lt;p&gt;Backend (FastAPI): Listens for these requests, processes them, and returns responses&lt;/p&gt;

&lt;p&gt;Frontend (React): Updates the UI based on the responses&lt;/p&gt;

&lt;p&gt;Key Connection Points:&lt;/p&gt;

&lt;p&gt;API_BASE Constant: const API_BASE = "&lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;"; tells the frontend where to find the backend&lt;/p&gt;

&lt;p&gt;CORS Middleware: The CORSMiddleware in FastAPI allows the frontend to make requests from a different domain (localhost:3000) to the backend (localhost:8000)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP Methods:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;axios.get() → @app.get() (Read)&lt;/li&gt;
&lt;li&gt;axios.post() → @app.post() (Create)&lt;/li&gt;
&lt;li&gt;axios.put() → @app.put() (Update)&lt;/li&gt;
&lt;li&gt;axios.delete() → @app.delete() (Delete)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;User interacts with React UI&lt;/li&gt;
&lt;li&gt;React sends HTTP request to FastAPI&lt;/li&gt;
&lt;li&gt;FastAPI processes request (reads/writes to database)&lt;/li&gt;
&lt;li&gt;FastAPI sends response back to React&lt;/li&gt;
&lt;li&gt;React updates UI based on response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Part 4: Deploying to the Internet&lt;br&gt;
Now let's make your application accessible to anyone on the internet! We'll use Heroku, a platform that makes deployment easy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Heroku CLI&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Download and install from heroku.com&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login to Heroku
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;heroku login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Create requirements.txt
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backend
pip freeze &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Explanation: This file lists all Python packages needed for your application. Heroku uses it to install dependencies.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create Procfile&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create a file named Procfile (no extension) in the backend directory with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web: uvicorn main:app --host=0.0.0.0 --port=$PORT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation: Tells Heroku how to start your application. The $PORT is provided by Heroku.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Initialize Git and Deploy
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Initialize git repository&lt;/span&gt;
git init
&lt;span class="c"&gt;# Add all files to git&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="c"&gt;# Commit files&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial commit"&lt;/span&gt;
&lt;span class="c"&gt;# Create Heroku app&lt;/span&gt;
heroku create your-app-name-backend
&lt;span class="c"&gt;# Deploy to Heroku&lt;/span&gt;
git push heroku main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;Git is a version control system that Heroku uses to deploy your code&lt;/p&gt;

&lt;p&gt;Replace your-app-name-backend with a unique name for your backend&lt;/p&gt;

&lt;p&gt;Frontend Deployment&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create Production Build
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation: Creates optimized production files in the build folder.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Serve Package
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation: serve is a simple static file server for production builds.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create Procfile&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Create a Procfile in the frontend directory with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web: serve -s build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation: Tells Heroku to serve the built React application.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update API_BASE&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Change the API_BASE in your React app to point to your deployed backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;API_BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://your-app-name-backend.herokuapp.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Deploy to Heroku
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Initialize git&lt;/span&gt;
git init
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial commit"&lt;/span&gt;
&lt;span class="c"&gt;# Create Heroku app&lt;/span&gt;
heroku create your-app-name-frontend
&lt;span class="c"&gt;# Deploy&lt;/span&gt;
git push heroku main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace your-app-name-frontend with a unique name for your frontend.&lt;/p&gt;

&lt;p&gt;Alternative: Deploy with Netlify (Easier for Frontend)&lt;br&gt;
For the frontend, Netlify is often easier than Heroku:&lt;/p&gt;

&lt;p&gt;Build your React app: npm run build&lt;/p&gt;

&lt;p&gt;Drag and drop the build folder to netlify.com&lt;/p&gt;

&lt;p&gt;Update API_BASE to point to your deployed backend&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Practices for Beginners&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code Organization: Keep your backend and frontend in separate directories&lt;/li&gt;
&lt;li&gt;Environment Variables: Use environment variables for configuration (like API URLs)&lt;/li&gt;
&lt;li&gt;Error Handling: Always add try-catch blocks around API calls&lt;/li&gt;
&lt;li&gt;Code Comments: Comment your code to explain complex logic&lt;/li&gt;
&lt;li&gt;Version Control: Use Git regularly to track changes&lt;/li&gt;
&lt;li&gt;Incremental Development: Build and test one feature at a time&lt;/li&gt;
&lt;li&gt;Troubleshooting Common Issues&lt;/li&gt;
&lt;li&gt;CORS Errors: Make sure your backend allows your frontend domain&lt;/li&gt;
&lt;li&gt;API Connection Issues: Check if your backend is running and the URL is correct&lt;/li&gt;
&lt;li&gt;Database Problems: For production, consider using PostgreSQL instead of SQLite&lt;/li&gt;
&lt;li&gt;Build Failures: Check that all dependencies are correctly listed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Next Steps&lt;/strong&gt;&lt;br&gt;
Now that you have a working CRUD application, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add user authentication&lt;/li&gt;
&lt;li&gt;Implement more complex data relationships&lt;/li&gt;
&lt;li&gt;Add image upload functionality&lt;/li&gt;
&lt;li&gt;Improve the UI with a CSS framework like Bootstrap or Material-UI&lt;/li&gt;
&lt;li&gt;Add form validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Congratulations! You've built and deployed a full-stack web application. The skills you've learned form the foundation of modern web development. Keep experimenting and building—the best way to learn is by doing!&lt;/p&gt;

&lt;p&gt;Remember, every developer started where you are now. With practice and persistence, you'll continue to grow your skills and build even more amazing applications. Happy coding!&lt;/p&gt;

</description>
      <category>react</category>
      <category>fastapi</category>
      <category>crud</category>
    </item>
    <item>
      <title>Animating the Modern Workspace with Pure CSS</title>
      <dc:creator>Gilbert Ngeno</dc:creator>
      <pubDate>Sun, 27 Jul 2025 13:22:22 +0000</pubDate>
      <link>https://dev.to/gilly7/animating-the-modern-workspace-with-pure-css-297o</link>
      <guid>https://dev.to/gilly7/animating-the-modern-workspace-with-pure-css-297o</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend/axero"&gt;Frontend Challenge: Office Edition sponsored by Axero, CSS Art: Office Culture&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;When I think of modern office culture, I immediately picture the hybrid work environment we've all adapted to - that perfect blend of traditional office elements with the new reality of video calls and remote collaboration. I wanted to capture that "lived-in" feeling of a real workspace: the essential coffee that keeps us going, the satisfying click of a mechanical keyboard, the desk plant that makes us feel more human, and those ever-present sticky notes trying to keep our chaotic work lives organized.&lt;/p&gt;

&lt;p&gt;The scene tells the story of someone mid-video call, surrounded by all the little details that make up our daily work ritual. It's both nostalgic for the classic office elements and contemporary with the video conferencing that's become central to how we work.&lt;/p&gt;

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


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://codesandbox.io/p/sandbox/fy47ly" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;codesandbox.io&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gilly7" rel="noopener noreferrer"&gt;
        gilly7
      &lt;/a&gt; / &lt;a href="https://github.com/gilly7/office-culture-css-art" rel="noopener noreferrer"&gt;
        office-culture-css-art
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An interactive and visually rich CSS art project that recreates a modern office desk scene using only HTML and CSS. This project demonstrates advanced CSS techniques, creative use of gradients, flexbox, grid, and keyframe animations to bring an office environment to life.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Office Culture CSS Art&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An interactive and visually rich CSS art project that recreates a modern office desk scene using only HTML and CSS. This project demonstrates advanced CSS techniques, creative use of gradients, flexbox, grid, and keyframe animations to bring an office environment to life—no images or SVGs, just pure CSS and HTML.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fully CSS-based Art&lt;/strong&gt;: All elements (desk, monitor, keyboard, coffee mug, plant, sticky notes, lamp, stress ball, papers, pen holder, and more) are created using HTML and styled with CSS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animated Details&lt;/strong&gt;: Includes animated steam from the coffee mug, blinking avatars in a video call, pulsing mouse light, swaying plant leaves, flickering lamp, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Responsive Layout&lt;/strong&gt;: The scene is centered and adapts to different screen sizes for a pleasant viewing experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Images or SVGs&lt;/strong&gt;: 100% CSS and HTML—great for learning and inspiration.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Preview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Open &lt;code&gt;index.html&lt;/code&gt; in your browser to view…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/gilly7/office-culture-css-art" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;This project was a deep dive into advanced CSS techniques. I started by sketching out the desk layout and then built each element layer by layer, focusing on creating depth through CSS transforms and perspective.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'm particularly proud of:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The 3D perspective effect&lt;/strong&gt; - Using &lt;code&gt;transform: perspective(1000px) rotateX(10deg)&lt;/code&gt; to give the entire scene depth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex layered animations&lt;/strong&gt; - Multiple elements animating independently but harmoniously (steam rising, keys typing, leaves swaying)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realistic materials&lt;/strong&gt; - Achieving wood grain, metal surfaces, and liquid effects purely through CSS gradients&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attention to detail&lt;/strong&gt; - From the glowing mouse sensor to the different colored pens, every element tells part of the office story&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Technical challenges I overcame:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coordinating multiple animation timelines to feel natural&lt;/li&gt;
&lt;li&gt;Creating realistic steam effects using opacity and transform animations&lt;/li&gt;
&lt;li&gt;Building a convincing video call interface with CSS grid&lt;/li&gt;
&lt;li&gt;Achieving proper layering and depth with z-index management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS keyframes can create incredibly sophisticated animations when layered thoughtfully.&lt;/li&gt;
&lt;li&gt;The power of CSS gradients for creating realistic textures and lighting.&lt;/li&gt;
&lt;li&gt;How perspective and transform can turn flat CSS into dimensional art.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This piece captures not just what an office looks like, but what it &lt;em&gt;feels&lt;/em&gt; like - the energy, the routine, the small moments that make up our work lives. It's a love letter to the spaces where we spend so much of our time, rendered entirely in the web's most fundamental styling language.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next steps:&lt;/strong&gt; I'd love to explore adding seasonal variations (holiday decorations, different lighting) or creating an interactive version where elements respond to user interaction while maintaining the pure CSS approach.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;License:&lt;/strong&gt; MIT - Feel free to use and modify!&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
    </item>
    <item>
      <title>TemplateSyntaxError: 'with' expected with atleast one variable assignment</title>
      <dc:creator>Gilbert Ngeno</dc:creator>
      <pubDate>Sun, 28 May 2023 11:28:31 +0000</pubDate>
      <link>https://dev.to/gilly7/templatesyntaxerror-with-expected-with-atleast-one-variable-assignment-4p3g</link>
      <guid>https://dev.to/gilly7/templatesyntaxerror-with-expected-with-atleast-one-variable-assignment-4p3g</guid>
      <description>&lt;div class="ltag__stackexchange--container"&gt;
  &lt;div class="ltag__stackexchange--title-container"&gt;
    
      &lt;div class="ltag__stackexchange--title"&gt;
        &lt;div class="ltag__stackexchange--header"&gt;
          &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackoverflow-logo-b42691ae545e4810b105ee957979a853a696085e67e43ee14c5699cf3e890fb4.svg" alt=""&gt;
          &lt;a href="https://stackoverflow.com/questions/36231619/templatesyntaxerror-with-expected-with-atleast-one-variable-assignment" rel="noopener noreferrer"&gt;
            TemplateSyntaxError: 'with' expected with atleast one variable assignment
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="ltag__stackexchange--post-metadata"&gt;
          &lt;span&gt;Mar 26 '16&lt;/span&gt;
            &lt;span&gt;Comments: 1&lt;/span&gt;
            &lt;span&gt;Answers: 1&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;a class="ltag__stackexchange--score-container" href="https://stackoverflow.com/questions/36231619/templatesyntaxerror-with-expected-with-atleast-one-variable-assignment" rel="noopener noreferrer"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackexchange-arrow-up-eff2e2849e67d156181d258e38802c0b57fa011f74164a7f97675ca3b6ab756b.svg" alt=""&gt;
        &lt;div class="ltag__stackexchange--score-number"&gt;
          16
        &lt;/div&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fstackexchange-arrow-down-4349fac0dd932d284fab7e4dd9846f19a3710558efde0d2dfd05897f3eeb9aba.svg" alt=""&gt;
      &lt;/a&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--body"&gt;
    
&lt;p&gt;I am trying to send the data of a &lt;strong&gt;meeting&lt;/strong&gt; object from template to view via &lt;strong&gt;GET&lt;/strong&gt; method. To give the attribute &lt;strong&gt;meeting.date&lt;/strong&gt; a simpler alias i.e &lt;strong&gt;date&lt;/strong&gt; I am using the &lt;strong&gt;with&lt;/strong&gt; template tag. But it ends up with a TemplateSyntaxError. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;urls.py&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;url(r'^meeting/$', meeting_display, name="meeting"),
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;views.py&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def meeting_display(request):
    date&lt;/code&gt;&lt;/pre&gt;…
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--btn--container"&gt;
    &lt;a href="https://stackoverflow.com/questions/36231619/templatesyntaxerror-with-expected-with-atleast-one-variable-assignment" class="ltag__stackexchange--btn" rel="noopener noreferrer"&gt;Open Full Question&lt;/a&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>How to reset Django admin password</title>
      <dc:creator>Gilbert Ngeno</dc:creator>
      <pubDate>Sat, 29 Apr 2023 09:07:30 +0000</pubDate>
      <link>https://dev.to/gilly7/how-to-reset-django-admin-password-hb6</link>
      <guid>https://dev.to/gilly7/how-to-reset-django-admin-password-hb6</guid>
      <description>&lt;p&gt;&lt;code&gt;python manage.py createsuperuser&lt;/code&gt; will create another superuser, you will be able to log into admin and remember your username.&lt;/p&gt;

&lt;p&gt;To give a normal user privileges, open a shell with python manage.py shell and try:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;from django.contrib.auth.models import User&lt;br&gt;
user = User.objects.get(username='normaluser')&lt;br&gt;
user.is_superuser = True&lt;br&gt;
user.save()&lt;/code&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>django</category>
      <category>python</category>
    </item>
    <item>
      <title>Spring Framework Practice Questions [Free Sample Copy]</title>
      <dc:creator>Gilbert Ngeno</dc:creator>
      <pubDate>Wed, 05 Oct 2022 07:53:59 +0000</pubDate>
      <link>https://dev.to/gilly7/spring-framework-practice-questions-free-sample-copy-4dgp</link>
      <guid>https://dev.to/gilly7/spring-framework-practice-questions-free-sample-copy-4dgp</guid>
      <description>&lt;p&gt;Get a sample copy of Spring Framework Practice Questions for Spring developer and Spring Professional interviews. It contains the first chapter and TOC, which will give you a quick overview of what you will get in the full book.&lt;/p&gt;

&lt;p&gt;If you like the sample copy and all the Java questions, you can buy the full book &lt;a href="https://gumroad.com/a/1036063859/qelhye" rel="noopener noreferrer"&gt;here&lt;/a&gt; on Gumroad.&lt;/p&gt;

&lt;p&gt;You can also use my code &lt;strong&gt;friends20 to get a 20% discount&lt;/strong&gt; for a limited time.&lt;/p&gt;

&lt;p&gt;Click &lt;a href="https://bit.ly/3Br5RY5" rel="noopener noreferrer"&gt;here&lt;/a&gt; to get your 20% Discount now - 20% OFF on Spring Framework Practice Questions&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>java</category>
      <category>spring</category>
      <category>interview</category>
    </item>
    <item>
      <title>250+ Spring Framework Practice Questions</title>
      <dc:creator>Gilbert Ngeno</dc:creator>
      <pubDate>Fri, 02 Sep 2022 06:29:35 +0000</pubDate>
      <link>https://dev.to/gilly7/250-spring-framework-practice-questions-3ang</link>
      <guid>https://dev.to/gilly7/250-spring-framework-practice-questions-3ang</guid>
      <description>&lt;p&gt;If you are preparing for Spring Professional certification, a Java interview with Spring Boot skills, or just want to test your Spring Framework skills, then these Practice questions are perfect for you. There are 250+ Questions on different spring topics, which will test your knowledge in depth. &lt;a href="https://gumroad.com/a/1036063859/sygyq" rel="noopener noreferrer"&gt;Get it here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>spring</category>
      <category>springboot</category>
      <category>interview</category>
    </item>
    <item>
      <title>Answer: Error: Cannot find module '@vue/cli-service/generator/template/src/App.vue' with vite</title>
      <dc:creator>Gilbert Ngeno</dc:creator>
      <pubDate>Thu, 23 Jun 2022 09:59:00 +0000</pubDate>
      <link>https://dev.to/gilly7/answer-error-cannot-find-module-vuecli-servicegeneratortemplatesrcappvue-with-vite-3250</link>
      <guid>https://dev.to/gilly7/answer-error-cannot-find-module-vuecli-servicegeneratortemplatesrcappvue-with-vite-3250</guid>
      <description>&lt;p&gt;&lt;a href="https://stackoverflow.com/a/68583755/12174468?stw=2" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>PowerShell says "execution of scripts is disabled on this system."</title>
      <dc:creator>Gilbert Ngeno</dc:creator>
      <pubDate>Thu, 23 Jun 2022 07:52:29 +0000</pubDate>
      <link>https://dev.to/gilly7/powershell-says-execution-of-scripts-is-disabled-on-this-system-10e4</link>
      <guid>https://dev.to/gilly7/powershell-says-execution-of-scripts-is-disabled-on-this-system-10e4</guid>
      <description>&lt;p&gt;&lt;a href="https://stackoverflow.com/q/4037939/12174468" rel="noopener noreferrer"&gt;https://stackoverflow.com/q/4037939/12174468&lt;/a&gt;&lt;/p&gt;

</description>
      <category>windows</category>
      <category>powershell</category>
    </item>
    <item>
      <title>How fix Jmeter on a Mac ? Could not initialize class org.apache.jmeter.gui.util.FileDialoger</title>
      <dc:creator>Gilbert Ngeno</dc:creator>
      <pubDate>Wed, 18 May 2022 09:14:38 +0000</pubDate>
      <link>https://dev.to/gilly7/how-fix-jmeter-on-a-mac-could-not-initialize-class-orgapachejmeterguiutilfiledialoger-297j</link>
      <guid>https://dev.to/gilly7/how-fix-jmeter-on-a-mac-could-not-initialize-class-orgapachejmeterguiutilfiledialoger-297j</guid>
      <description>&lt;p&gt;&lt;a href="https://david.raleche.com/web-consulting/how-fix-jmeter-on-a-mac-could-not-initialize-class-org-apache-jmeter-gui-util-filedialoger/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jmeter</category>
    </item>
  </channel>
</rss>
