<?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: Shiv Rai (S_RAI)</title>
    <description>The latest articles on DEV Community by Shiv Rai (S_RAI) (@rai_shiv).</description>
    <link>https://dev.to/rai_shiv</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%2F3772695%2F2e3d2879-a059-4490-8c06-86b081eef8e5.png</url>
      <title>DEV Community: Shiv Rai (S_RAI)</title>
      <link>https://dev.to/rai_shiv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rai_shiv"/>
    <language>en</language>
    <item>
      <title>Request/Response APIs: REST vs GraphQL vs OData vs Falcor</title>
      <dc:creator>Shiv Rai (S_RAI)</dc:creator>
      <pubDate>Mon, 14 Sep 2026 14:08:50 +0000</pubDate>
      <link>https://dev.to/rai_shiv/requestresponse-apis-rest-vs-graphql-vs-odata-vs-falcor-b52</link>
      <guid>https://dev.to/rai_shiv/requestresponse-apis-rest-vs-graphql-vs-odata-vs-falcor-b52</guid>
      <description>&lt;h2&gt;
  
  
  What are Request/Response APIs?
&lt;/h2&gt;

&lt;p&gt;Request/Response APIs are the most common way for applications to communicate across process, network, or service boundaries. A client sends a request for information or an action, and a server returns a response containing the result.&lt;/p&gt;

&lt;p&gt;This model is simple, predictable, and well-suited to workloads where a consumer knows when it needs data and expects an immediate answer. Web applications, mobile apps, dashboards, internal tools, and third-party integrations all commonly rely on request/response communication.&lt;/p&gt;

&lt;p&gt;Common use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRUD applications&lt;/li&gt;
&lt;li&gt;Web and mobile backends&lt;/li&gt;
&lt;li&gt;Public developer platforms&lt;/li&gt;
&lt;li&gt;Internal business systems&lt;/li&gt;
&lt;li&gt;Reporting and analytics APIs&lt;/li&gt;
&lt;li&gt;Data access layers for enterprise applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article includes: REST, GraphQL, Falcor, OData.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to choose?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Simplicity, interoperability, and widespread ecosystem support -&amp;gt; REST&lt;/li&gt;
&lt;li&gt;Clients need flexible access to complex data -&amp;gt; GraphQL&lt;/li&gt;
&lt;li&gt;Efficient access to large, connected data graphs -&amp;gt; Falcor&lt;/li&gt;
&lt;li&gt;Standardization, querying capabilities, and enterprise integration are primary concerns -&amp;gt; OData
&lt;/li&gt;
&lt;/ol&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD

A[Need a Request/Response API] --&amp;gt; B{Need a standardized query language&amp;lt;br/&amp;gt;for business data and integrations?}

B --&amp;gt;|Yes| O[OData]
B --&amp;gt;|No| C{Do clients need precise control&amp;lt;br/&amp;gt;over returned fields and shapes?}

C --&amp;gt;|No| R[REST]
C --&amp;gt;|Yes| D{Are you building around a&amp;lt;br/&amp;gt;single logical data graph with&amp;lt;br/&amp;gt;heavy client-side navigation?}

D --&amp;gt;|Yes| F[Falcor]
D --&amp;gt;|No| G[GraphQL]&lt;/code&gt;&lt;/pre&gt;






&lt;h2&gt;
  
  
  Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;REST&lt;/th&gt;
&lt;th&gt;GraphQL&lt;/th&gt;
&lt;th&gt;Falcor&lt;/th&gt;
&lt;th&gt;OData&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mental Model&lt;/td&gt;
&lt;td&gt;Resources exposed through endpoints&lt;/td&gt;
&lt;td&gt;Query a graph of data&lt;/td&gt;
&lt;td&gt;Navigate a virtual JSON graph&lt;/td&gt;
&lt;td&gt;Resources enhanced by a standardized query language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Fetching Flexibility&lt;/td&gt;
&lt;td&gt;Low to Medium&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium to High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client Control&lt;/td&gt;
&lt;td&gt;Limited by endpoints&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium to High&lt;/td&gt;
&lt;td&gt;Medium to High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caching&lt;/td&gt;
&lt;td&gt;Excellent and well understood&lt;/td&gt;
&lt;td&gt;More challenging&lt;/td&gt;
&lt;td&gt;Good with graph-aware tooling&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tooling&lt;/td&gt;
&lt;td&gt;Extremely mature&lt;/td&gt;
&lt;td&gt;Mature and growing&lt;/td&gt;
&lt;td&gt;Smaller ecosystem&lt;/td&gt;
&lt;td&gt;Strong enterprise ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning Curve&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Medium to High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical Use Cases&lt;/td&gt;
&lt;td&gt;Public APIs, web services, CRUD systems&lt;/td&gt;
&lt;td&gt;Frontend-heavy applications, aggregating multiple data sources&lt;/td&gt;
&lt;td&gt;Rich data-driven applications with complex relationships&lt;/td&gt;
&lt;td&gt;Enterprise systems, analytics, business applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strengths&lt;/td&gt;
&lt;td&gt;Simplicity, scalability, broad adoption&lt;/td&gt;
&lt;td&gt;Flexible queries, reduced over/under-fetching&lt;/td&gt;
&lt;td&gt;Efficient graph traversal and data reuse&lt;/td&gt;
&lt;td&gt;Standardized querying and interoperability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weaknesses&lt;/td&gt;
&lt;td&gt;Multiple requests for related data, endpoint proliferation&lt;/td&gt;
&lt;td&gt;Increased operational and schema complexity&lt;/td&gt;
&lt;td&gt;Smaller adoption and ecosystem&lt;/td&gt;
&lt;td&gt;Can feel verbose and enterprise-oriented&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  REST
&lt;/h2&gt;

&lt;p&gt;REST stands for REpresentational State Transfer. It was introduced by Roy Fielding, one of the creators of HTTP. He published his PhD dissertation in 2000 explaining why the World Wide Web scaled so well. According to him, the web succeeded because it followed certain architectural constraints. This architectural style became known as REST.&lt;/p&gt;

&lt;p&gt;REST offered a simpler model than the RPC-style communication common between systems at the time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything important is a resource&lt;/li&gt;
&lt;li&gt;Resources have URLs&lt;/li&gt;
&lt;li&gt;Standard HTTP methods operate on those resources&lt;/li&gt;
&lt;li&gt;Clients and servers remain loosely coupled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;REST isn't a protocol. It's an architectural style.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Strict REST, as originally defined, includes additional constraints such as HATEOAS (Hypermedia as the Engine of Application State). In practice, many APIs commonly referred to as "REST APIs" do not fully implement every constraint from the original definition — what most teams build and call "REST" is closer to resource-oriented HTTP APIs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  REST thinks in resources
&lt;/h3&gt;

&lt;p&gt;A resource is simply a thing your system exposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users&lt;/li&gt;
&lt;li&gt;Books&lt;/li&gt;
&lt;li&gt;Orders&lt;/li&gt;
&lt;li&gt;Authors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of:&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="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;deleteUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;REST is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST   /users
GET    /users/123
DELETE /users/123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Create a user:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /users

Content-Type: application/json

{
  "name": "Alice"
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;201 Created

{
  "id": 123,
  "name": "Alice"
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fetch a user:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users/123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A representation of a resource is transferred during calls, not the resource itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros and Cons
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Simple and easy to understand using standard HTTP methods (GET, POST, PUT, DELETE).&lt;/td&gt;
&lt;td&gt;Can lead to overfetching (receiving more data than needed).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Universally supported across browsers, servers, mobile apps, proxies, and CDNs.&lt;/td&gt;
&lt;td&gt;Can lead to underfetching (multiple requests needed to gather related data).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leverages existing HTTP infrastructure and tooling.&lt;/td&gt;
&lt;td&gt;No built-in strong typing or schema enforcement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache-friendly through HTTP caching headers and CDN support.&lt;/td&gt;
&lt;td&gt;API contracts are often documented separately and validated at runtime.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource-oriented design maps naturally to CRUD operations.&lt;/td&gt;
&lt;td&gt;Modeling complex business actions can become awkward.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stateless architecture improves scalability and reliability.&lt;/td&gt;
&lt;td&gt;Real-time communication is not natively supported.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human-readable requests and responses simplify debugging.&lt;/td&gt;
&lt;td&gt;Versioning strategies can become complicated over time.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loose coupling between clients and servers allows independent evolution.&lt;/td&gt;
&lt;td&gt;Deeply nested or relational data often requires multiple round trips.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Easy to test using browsers, curl, Postman, or similar tools.&lt;/td&gt;
&lt;td&gt;Performance may suffer in chatty client-server interactions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large ecosystem, mature best practices, and widespread adoption.&lt;/td&gt;
&lt;td&gt;Different teams often interpret REST principles differently, leading to inconsistent APIs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  GraphQL
&lt;/h2&gt;

&lt;p&gt;Facebook developed GraphQL internally in 2012 to tackle the difficulty of working with REST APIs as their mobile apps grew. Facebook open-sourced GraphQL in 2015.&lt;/p&gt;

&lt;p&gt;Mobile clients often faced problems such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slow networks&lt;/li&gt;
&lt;li&gt;Limited bandwidth&lt;/li&gt;
&lt;li&gt;Multiple API requests for a single screen&lt;/li&gt;
&lt;li&gt;Different data requirements across platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;REST forces the server to decide what data is returned. GraphQL lets the client decide. Instead of many endpoints, GraphQL provides a single endpoint, &lt;code&gt;/graphql&lt;/code&gt;, through which all actions take place.&lt;/p&gt;

&lt;h3&gt;
  
  
  GraphQL thinks in queries
&lt;/h3&gt;

&lt;p&gt;The client describes the exact structure of the response. The client requests fields, and the server assembles the response.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;A user has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id
name
email
avatar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Client only needs name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Client needs name + email:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"alice@example.com"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pros and Cons
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Eliminates overfetching&lt;/td&gt;
&lt;td&gt;More complex backend architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduces underfetching and multiple requests&lt;/td&gt;
&lt;td&gt;Caching is harder than REST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strong schema and typing&lt;/td&gt;
&lt;td&gt;Can suffer from N+1 query issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Excellent tooling and developer experience&lt;/td&gt;
&lt;td&gt;Query complexity must be controlled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexible for multiple client types&lt;/td&gt;
&lt;td&gt;Overkill for simple CRUD systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-documenting schema&lt;/td&gt;
&lt;td&gt;Additional learning curve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Easier API evolution&lt;/td&gt;
&lt;td&gt;Monitoring and performance tuning are harder&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Falcor
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A note on relevance:&lt;/strong&gt; Falcor is included here primarily for historical and conceptual understanding — it introduced ideas (like a unified virtual data graph) that are useful for building intuition. In practice, GraphQL became the dominant solution for flexible, client-driven data fetching.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Falcor was created by Netflix and open-sourced in 2015. Netflix applications needed data from many backend services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Recommendations
User Profiles
Ratings
Viewing History
Search
Metadata
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building a screen often required multiple API calls. This created:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overfetching&lt;/li&gt;
&lt;li&gt;Underfetching&lt;/li&gt;
&lt;li&gt;High latency&lt;/li&gt;
&lt;li&gt;Complex frontend code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Falcor introduced a concept called the JSON Graph. Instead of exposing APIs as resources or functions, the server exposes a graph of interconnected data. The client requests paths through that graph.&lt;/p&gt;

&lt;h3&gt;
  
  
  Falcor thinks in graphs
&lt;/h3&gt;

&lt;p&gt;Imagine application data as one giant object:&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="nx"&gt;movies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="nx"&gt;ratings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="nx"&gt;recommendations&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clients don't call endpoints. They ask for paths inside the graph.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;
&lt;span class="nx"&gt;movies&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;rating&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Core assumption: Application data is a graph, and clients should navigate that graph directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;Suppose the graph contains:&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Client requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;model&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&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;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonGraph"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"users"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"123"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pros and Cons
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Flexible graph-based data access&lt;/td&gt;
&lt;td&gt;Steeper learning curve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in client caching&lt;/td&gt;
&lt;td&gt;Small ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduces API round trips&lt;/td&gt;
&lt;td&gt;Limited adoption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handles relationships naturally&lt;/td&gt;
&lt;td&gt;GraphQL largely replaced it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Efficient for connected data&lt;/td&gt;
&lt;td&gt;Fewer tools and community resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client-driven fetching&lt;/td&gt;
&lt;td&gt;Complex mental model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Good Netflix-scale use cases&lt;/td&gt;
&lt;td&gt;Rarely chosen for new projects&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  OData
&lt;/h2&gt;

&lt;p&gt;As organizations exposed more data over HTTP, developers repeatedly faced the same problems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users
GET /products
GET /orders
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every API invented its own way to support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Filtering&lt;/li&gt;
&lt;li&gt;Sorting&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Searching&lt;/li&gt;
&lt;li&gt;Expanding related data&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users?status=active
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;might work in one API, while another used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users?filter=status:active
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There was no standard way to query data over HTTP. OData (Open Data Protocol) was introduced by Microsoft in 2007 and later standardized through OASIS. OData attempted to create SQL-like querying for HTTP APIs. Instead of every API inventing its own query language, clients could use a standard set of query operations.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Clarification — REST vs. OData:&lt;/strong&gt; Traditional REST APIs usually expose fixed resource representations, meaning the server largely decides what shape a response takes. OData extends REST-style APIs with a standardized querying layer on top, giving clients more control over returned data (filtering, selecting fields, expanding relations) without changing the underlying request/response model.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  OData thinks in queryable resources
&lt;/h3&gt;

&lt;p&gt;Core assumption: APIs expose resources the same way REST does, but those resources are enhanced with a standardized query language — so clients can filter, sort, select fields, and expand relations without the server needing to build a custom endpoint for every variation.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /active-users
GET /users-by-country
GET /top-customers
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you expose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and allow the client to specify the query. The server provides the data. The client decides how to filter it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;Let's say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bob"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"IN"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Client requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /users?$filter=country eq 'US'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pros and Cons
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Powerful built-in querying&lt;/td&gt;
&lt;td&gt;Query language complexity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standardized filtering and sorting&lt;/td&gt;
&lt;td&gt;Can expose expensive operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduces endpoint proliferation&lt;/td&gt;
&lt;td&gt;Tight coupling to data models&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metadata discovery support&lt;/td&gt;
&lt;td&gt;Less flexible than GraphQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Great for business datasets&lt;/td&gt;
&lt;td&gt;Smaller ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strong enterprise tooling&lt;/td&gt;
&lt;td&gt;Rarely used for public APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP and REST friendly&lt;/td&gt;
&lt;td&gt;Requires careful security controls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Choose REST&lt;/strong&gt; when you want simplicity, broad tooling support, strong HTTP caching, and your data access patterns are mostly straightforward CRUD.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose GraphQL&lt;/strong&gt; when clients have varied or evolving data needs, over/underfetching is a real problem, and you can support the added backend complexity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose OData&lt;/strong&gt; when you need standardized, SQL-like querying (filtering, sorting, expanding relations) over business data, especially in enterprise or Microsoft-adjacent ecosystems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose Falcor&lt;/strong&gt; rarely, if ever, for new projects — it's mainly useful for understanding the "unified data graph" mental model.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>webdev</category>
      <category>api</category>
      <category>systemdesign</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Stellar programs for Developers</title>
      <dc:creator>Shiv Rai (S_RAI)</dc:creator>
      <pubDate>Mon, 25 May 2026 09:48:52 +0000</pubDate>
      <link>https://dev.to/rai_shiv/stellar-programs-for-developers-5e00</link>
      <guid>https://dev.to/rai_shiv/stellar-programs-for-developers-5e00</guid>
      <description>&lt;p&gt;If you have been looking for support to build the next big thing on Stellar, this is the article you must read!&lt;/p&gt;

&lt;p&gt;Stellar is a decentralized, public blockchain that is not only faster and cheaper but also more energy-efficient than most public blockchains, with an average cost of $0.0006667 per transaction, a global reach of 180+ countries, $167M TVL, and 5.3s settlement time.&lt;/p&gt;

&lt;p&gt;To help builders and developers, Stellar Development Foundation (SDF) has introduced various programs that you can apply to:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Instawards&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Offered through local Stellar Ambassador Chapters, Instawards is a small funding opportunity for early-stage builders. It prioritizes builders with strong collaboration, commitment, and execution readiness.&lt;br&gt;
Instawards are the first step toward bigger opportunities in the stellar ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Build Award&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Consisting of 3 tracks - Open, Integration, and RFP - the Build Award provides up to $150k in XLM for teams building on Stellar. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Track:
Teams with a plan to build something new on Stellar.&lt;/li&gt;
&lt;li&gt;Integration Track:
Teams that are either incorporating an existing Stellar tool or dApp into their project OR already have existing significant traction on any chain or off-chain&lt;/li&gt;
&lt;li&gt;RFP Track:
Developers and teams building tools or services, who are prepared to build and ship.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Review Process:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prescreen: Complete application and eligibility criteria are met&lt;/li&gt;
&lt;li&gt;Panel Review: Projects are evaluated based on ecosystem value, technical feasibility, roadmap clarity, and team capability.&lt;/li&gt;
&lt;li&gt;Revision Window: Teams are given time to make minor revisions to their submission. This happens before the community vote for Open Track; For the RFP and Integration Tracks, reviewers may request changes.&lt;/li&gt;
&lt;li&gt;Community Vote (For Open Track): SCF community members vote on projects. This drives the final decision.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Audit Bank&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;SDF covers audits for SCF-awarded projects&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Public Goods Award&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Public Goods Award supports public goods maintained by the community -  key infrastructure, tools for the ecosystem, data, governance, and more of the Stellar ecosystem.&lt;br&gt;
It is managed through Soroban Governor.&lt;br&gt;
Applications for the Public Goods Award are invitation-only. If you meet the eligibility requirements, make sure to check the #scf-governance discord channel for next review period.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Liquidity Award&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The Liquidity Award provides funding for the initial liquidity needs of financial protocols that have completed security audits and are live on Stellar mainnet. Liquidity Award can provide a Base Liquidity Award of $50K with a Supplemental Liquidity Award of an additional $50k.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Growth Hack&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It is an 8-week, competition-style GTM/PMF program where 10-15 teams compete with $20k in initial funding to run a 4-week acquisition + 4-week retention campaign. Top performers receive a share of $200k. The program helps teams find PMF and serves as a bridge between development funding and further growth.&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%2Fpkszjar8pbj6pvl4cwkc.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%2Fpkszjar8pbj6pvl4cwkc.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each program has its own requirements and rules. The funds are provided in XLM, which is the native currency of Stellar.&lt;/p&gt;

&lt;p&gt;You can choose which program to apply for based on your stage. If you are just starting out, apply for Instawards. Later, you can apply for SCF.&lt;/p&gt;

&lt;p&gt;Stellar focuses heavily on DeFi products like remittances, asset tokenization, wallets, and payments. So, if you are building something related, you should definitely apply to these programs.&lt;/p&gt;

&lt;p&gt;For more information, read the SCF handbook here: &lt;a href="https://stellar.gitbook.io/scf-handbook" rel="noopener noreferrer"&gt;https://stellar.gitbook.io/scf-handbook&lt;/a&gt;&lt;br&gt;
For information on SCF projects, upcoming rounds, and submission forms for eligible projects: &lt;a href="https://communityfund.stellar.org/" rel="noopener noreferrer"&gt;communityfund.stellar.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy developing!&lt;/p&gt;

</description>
      <category>web3</category>
      <category>development</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Pegasus: Your Document's Language Passport, Powered by Lingo.Dev</title>
      <dc:creator>Shiv Rai (S_RAI)</dc:creator>
      <pubDate>Mon, 16 Mar 2026 12:56:40 +0000</pubDate>
      <link>https://dev.to/rai_shiv/pegasus-your-documents-language-passport-powered-by-lingodev-19h1</link>
      <guid>https://dev.to/rai_shiv/pegasus-your-documents-language-passport-powered-by-lingodev-19h1</guid>
      <description>&lt;p&gt;If I asked you "How many languages are there in the world?", what will you say? "500"? "1000"? "5000"? Still not there yet. There are 7000+ languages in the world. Yet, most of us can name around 10-20. English, being the most common, since it is used globally. However, there are people who do not speak English and there are places, where English is not the preferred language for documents. And that is totally fine. Its a wide world. People are free to speak the language they choose. &lt;/p&gt;

&lt;p&gt;However, this creates a gap in communication. One or sometimes more than one party, has to use a translator in order to communicate. People often use tools like Google Translate in such situations. But, what about documents?&lt;br&gt;
Imagine you sent a pdf or docx to someone in English. That person requested a French version. What will you do ? you copy paste your content into a translator, copy paste the response back into your docx, save it, and share it back to the person. This was a single request. For 1 language. There are more than 20 languages spoken by more than half of the world’s population. Let's assume that just half of them requested a version in their language, which means 10. Are you going to repeat the process 10 times ? That's not sensible, right ? Let's assume you are a hard-worker and did it 10 times. Hurray! But wait... you just noticed there is a small change that needs to be done. You made the change in the original document. And then you realize, you have to do the translations again for the 10 requests. &lt;/p&gt;

&lt;p&gt;At this point you are putting in more effort for preparing document for sharing than doing something productive. But what's the solution to this problem? What if you could just make a single file, with all the translations, rendered according to user's preference? Imagine how easy it would be. Create your file, add translations, share a single file, and you are done. Sounds simple, right? Worry not, it is simple with Pegasus.&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%2F428g6k741adjbs88gpdy.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%2F428g6k741adjbs88gpdy.png" alt="Pegasus" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is Pegasus?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Imagine an app through which you can create a single file with all the required language translations you want, share it with your team, and they can view it in their preferred language, without even needing internet. How amazing would that be? Pegasus is that app!&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%2Fz2hpdqhb8uiio6aqc46b.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%2Fz2hpdqhb8uiio6aqc46b.png" alt="Doc View" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How Pegasus works?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You choose your document (txt, docx, pdf), select the languages you want the translations of, add lingo dev API key, choose the output folder. And that's it. You get a .pgs file which you can share with whoever you want and they can open Pegasus, open this .pgs file, and view it in their language (without API key).&lt;/p&gt;

&lt;p&gt;What if someone got the file but their language translation wasn't available? They can add the translations of their language within the .pgs file following the same steps to create the file. The best part, the current translations available aren't removed. New translations are added along with existing translations. &lt;/p&gt;

&lt;p&gt;The app only requires internet connection when you need translations. Otherwise, it can be used to view files and their translations without the need of internet. Reason, the single file contains all the data required. &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%2Fw9yd7fiebey2kmyqqhzc.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%2Fw9yd7fiebey2kmyqqhzc.png" alt="Language Selection" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How it's made?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It's made using Electron.js + Vite + react in typescript, along with tailwindCSS and powered by Lingo.Dev&lt;br&gt;
Lingo Dev's API is used for document content translation while Lingo Dev's Compiler is used to translate the UI content of Pegasus app.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;GitHub Repo&lt;/u&gt;: &lt;a href="https://github.com/ShivRaiGithub/pegasus" rel="noopener noreferrer"&gt;https://github.com/ShivRaiGithub/pegasus&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%2Fdxbfm3xq2mn8ac9uvwe5.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%2Fdxbfm3xq2mn8ac9uvwe5.png" alt="Conversion page 2" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Problem Pegasus solves&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;BILLIONS of digital documents require translations EVERYDAY. Business contracts, government papers, product manuals, etc are examples of some documents whose digital versions need various translations for multiple languages. Large companies usually maintain more than 5 language versions of same document. This piles up in costs, leading to thousands of dollars just to maintain few documents. These costs can be reduced multi-fold. What do you think is the market size of multilingual document translation ? More than $60B. But now,&lt;br&gt;
&lt;u&gt;Instead of&lt;/u&gt;:&lt;br&gt;
policy_en.pdf&lt;br&gt;
policy_fr.pdf&lt;br&gt;
policy_es.pdf&lt;br&gt;
policy_de.pdf&lt;br&gt;
policy_hi.pdf&lt;br&gt;
&lt;u&gt;There can be a single&lt;/u&gt;:&lt;br&gt;
policy.pgs&lt;/p&gt;

&lt;p&gt;Costs reduced. Inefficiencies decreased. All through a single and simple app.&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%2F21cr81lp37y4ewr0o5ij.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%2F21cr81lp37y4ewr0o5ij.png" alt="View doc in translated languages" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;More about Pegasus and my experience&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
1) At first, Pegasus worked only for txt files. I later added features for it to work with docx files as well as pdf files. There were so many issues that arose while working with docx and pdf files. The reason for that is, unlike txt files, docx and pdf files have a structure and a layout. I tried few ways to ensure that the translations follow the actual layout as much as possible. Eventually I reached a satisfiable outcome for pdfs and docs too.&lt;br&gt;
2) I wanted to make PPTs work with Pegasus too, but due to the time constraint, I wasn't able to. Working with PPTs requires better ways to extract text and place them back while making sure the bg is not affected. Working with PPTs and other file formats is something that can be done in the future.&lt;br&gt;
3) Working with Hindi. Hindi characters weren't visible. I had to download another npm package that can be used to display devnagari script.&lt;br&gt;
4) Due to time constraints, I wasn't able to make dedicated download files (like exe for windows). But the repo is self sufficient to build and run the application. All the steps are in the readme.&lt;br&gt;
5) I wanted to try something new for demo video, so I created the demo video using AI generated clips + screen recordings.&lt;br&gt;
6) I have done most of the app building and testing on WSL. I did test the app on windows, but not on iOS.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Study Table: Task-focused environment</title>
      <dc:creator>Shiv Rai (S_RAI)</dc:creator>
      <pubDate>Sun, 01 Mar 2026 17:52:41 +0000</pubDate>
      <link>https://dev.to/rai_shiv/study-table-task-focused-environment-2j95</link>
      <guid>https://dev.to/rai_shiv/study-table-task-focused-environment-2j95</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/weekend-2026-02-28"&gt;DEV Weekend Challenge: Community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Community
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;StudyTable&lt;/strong&gt; for students, developers, and builders who regularly participate in focused study or work sessions — especially people who learn independently or work on side projects.&lt;/p&gt;

&lt;p&gt;Many communities today (open-source contributors, students preparing for exams, hackathon participants, self-learners, etc.) struggle not with &lt;em&gt;starting&lt;/em&gt; work, but with maintaining structured, distraction-free focus.&lt;/p&gt;

&lt;p&gt;StudyTable is designed for anyone who values deep work and intentional learning.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;StudyTable&lt;/strong&gt; is a frontend-only web app that helps users run structured focus sessions.&lt;/p&gt;

&lt;p&gt;Instead of being just another timer, StudyTable treats work as a &lt;strong&gt;guided session&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users create sessions with tasks with custom durations.&lt;/li&gt;
&lt;li&gt;Each task runs as a timed focus block.&lt;/li&gt;
&lt;li&gt;After completion, users intentionally transition into breaks or extend work time.&lt;/li&gt;
&lt;li&gt;Sessions generate time reports showing how time was actually spent on the work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The experience is designed to feel simple and calm — reducing decision fatigue while working.&lt;/p&gt;

&lt;p&gt;Core idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Most productivity apps track time.&lt;br&gt;
StudyTable helps users &lt;strong&gt;utilize time intentionally&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Website: &lt;a href="https://studytable-psi.vercel.app/" rel="noopener noreferrer"&gt;https://studytable-psi.vercel.app/&lt;/a&gt;&lt;br&gt;
Youtube: &lt;a href="https://youtu.be/dbjE8EMlAHI" rel="noopener noreferrer"&gt;https://youtu.be/dbjE8EMlAHI&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Github Repo: &lt;a href="https://github.com/ShivRaiGithub/studytable" rel="noopener noreferrer"&gt;https://github.com/ShivRaiGithub/studytable&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;StudyTable is intentionally built &lt;strong&gt;without a backend&lt;/strong&gt;, keeping the architecture lightweight and accessible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technologies Used
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js (App Router)&lt;/strong&gt; — application structure and routing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; — UI and state management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; — safer and maintainable code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; — styling and layout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solo Member: Shiv Rai (S_RAI)&lt;br&gt;
Dev.to: &lt;a href="https://dev.to/rai_shiv"&gt;https://dev.to/rai_shiv&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Ouija Terminal - GitHub Copilot CLI Challenge</title>
      <dc:creator>Shiv Rai (S_RAI)</dc:creator>
      <pubDate>Sun, 15 Feb 2026 12:42:36 +0000</pubDate>
      <link>https://dev.to/rai_shiv/ouija-terminal-github-copilot-cli-challenge-3no9</link>
      <guid>https://dev.to/rai_shiv/ouija-terminal-github-copilot-cli-challenge-3no9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;A fun little project built &lt;strong&gt;fully using Github Copilot CLI only&lt;/strong&gt;. &lt;br&gt;
&lt;u&gt;"Ouija Terminal"&lt;/u&gt;, a terminal which seems normal at first, but all interaction ultimately lead to the paranormal. &lt;br&gt;
There are various interactions you can do with the terminal through commands like saving name, changing theme of terminal, get current status, get time and date, etc. But each command changes it's behavior as you interact more.&lt;br&gt;
&lt;u&gt;Try it for yourself&lt;/u&gt;: &lt;a href="https://ouija-terminal.vercel.app/" rel="noopener noreferrer"&gt;https://ouija-terminal.vercel.app/&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Demo&lt;/strong&gt;: &lt;a href="https://youtu.be/FMNh3W5Ccuw" rel="noopener noreferrer"&gt;https://youtu.be/FMNh3W5Ccuw&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://ouija-terminal.vercel.app/" rel="noopener noreferrer"&gt;https://ouija-terminal.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vibe coding video&lt;/strong&gt;: &lt;a href="https://youtu.be/LeKYyDMaXN0" rel="noopener noreferrer"&gt;https://youtu.be/LeKYyDMaXN0&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Images
&lt;/h2&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%2Ft2op32by3lwc1oy5hwm1.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%2Ft2op32by3lwc1oy5hwm1.png" alt="Ouija Terminal" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwkivnm845k42gobeb31f.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%2Fwkivnm845k42gobeb31f.png" alt="Ouija Terminal Interactions 1" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmalfxy05fk45nhqmb11.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%2Fsmalfxy05fk45nhqmb11.png" alt="Ouija Terminal Interactions 2" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;This was actually the &lt;strong&gt;first time I used an AI from CLI&lt;/strong&gt;. I haven't even used Claude Code before. I usually use Copilot Agent.&lt;br&gt;
Using CLI felt a little slower as compared to Copilot Agent on the file generation and editing part. But at the same time I never had to click "Continue" anywhere which usually appears when working with Agent.&lt;br&gt;
Also, there were different options available when executing a command which allowed you to set the permission to execute the commands for the entire CLI session which is a nice touch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team Members
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Solo member&lt;/strong&gt;: Shiv Rai (S_RAI) &lt;a class="mentioned-user" href="https://dev.to/rai_shiv"&gt;@rai_shiv&lt;/a&gt; &lt;br&gt;
&lt;a href="https://dev.to/rai_shiv"&gt;https://dev.to/rai_shiv&lt;/a&gt;&lt;/p&gt;

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