From f8f125ceb56c49c6a574d6c62507c2d78bf0f6b4 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Thu, 16 Jul 2026 13:52:15 +0530 Subject: [PATCH 1/9] latest seo blogs --- .optimize-cache.json | 3 + .../+page.markdoc | 156 +++++++++++++++++ .../post/what-is-crud-explained/+page.markdoc | 162 ++++++++++++++++++ .../+page.markdoc | 126 ++++++++++++++ .../cover.avif | Bin 0 -> 22806 bytes .../blog/what-is-crud-explained/cover.avif | Bin 0 -> 14322 bytes .../cover.avif | Bin 0 -> 23529 bytes 7 files changed, 447 insertions(+) create mode 100644 src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc create mode 100644 src/routes/blog/post/what-is-crud-explained/+page.markdoc create mode 100644 src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc create mode 100644 static/images/blog/asynchronous-vs-synchronous-programming/cover.avif create mode 100644 static/images/blog/what-is-crud-explained/cover.avif create mode 100644 static/images/blog/what-is-mcp-a-complete-guide-for-developers/cover.avif diff --git a/.optimize-cache.json b/.optimize-cache.json index 02c057507a..c4f8d41848 100644 --- a/.optimize-cache.json +++ b/.optimize-cache.json @@ -355,6 +355,7 @@ "static/images/blog/arena-june-2026-update/arena-leaderboard-without-skills.png": "f164ccde7cad0a8316104fea77d841b3b08d453b31489e00b383c1275b25e885", "static/images/blog/arena-june-2026-update/arena-opus-4-8-detail.png": "4008cb53a904cdf919f0fe7bf8820f6c9b6f46892c6fdda3ea7157633eb89b85", "static/images/blog/arena-june-2026-update/cover.png": "e6f5d1d1f405a7bf42499cec7a8044ef80ac7d5dc83ae81a3cdfaa5bd5913023", + "static/images/blog/asynchronous-vs-synchronous-programming/cover.png": "05f7cafd56a818c9a1719e719eac9dc370e9332f04086e78f162b3843f12966e", "static/images/blog/avif-in-storage/cover.png": "23c26ec1a8f23f5bf6c55b19407d0738aa41cdc502dc3eef14a78f430a14447b", "static/images/blog/avoid-backend-overengineering/cover.png": "c586c235dd6d3f992980748ec7b15cd3411edefe2e71dffc080840540f6d3ba3", "static/images/blog/baa-explained/cover.png": "a7b144c7549498760cc2bfddda186b8182766ef72e308abc637dc4cbb5a2c853", @@ -1271,8 +1272,10 @@ "static/images/blog/what-is-ciam/cover.png": "45a5261ae1bb8a38777f60a21ea60426c0832e3d58bf3164100548400d388ce1", "static/images/blog/what-is-cicd-a-complete-guide-for-developers/cover.png": "7abddce55b1467188faab83abd58189173bf9aba84de3d9f28fff0be8c6e9276", "static/images/blog/what-is-cloud-storage-an-expert-guide-for-developers/cover.png": "b7f545dbe9334d60f214e748ddfcea47484530a97f30ecf579d064a053c2821d", + "static/images/blog/what-is-crud-explained/cover.png": "8fd6708a0fb92bcfd5cbf91dcde7630585abd9e97dbbe7d6577b32202675fbf3", "static/images/blog/what-is-docker-a-simple-guide-for-developers/cover.png": "acd9c50ad749fcf676dd58b38cc6bbffba913bf5d817c6b725bd2c305088689e", "static/images/blog/what-is-kubernetes-an-expert-guide-for-developers/cover.png": "a7601f375841b143d62511fe3bbfb4bacb6989ddc56613f772b7dcd3d5e90688", + "static/images/blog/what-is-mcp-a-complete-guide-for-developers/cover.png": "71734bd04b81de2617eb12d2ffb58781092fa2ab970626c748e263d31a9a8866", "static/images/blog/what-is-mcp/claude-mcp-chat.png": "26842cfebca3ec2cec89448e1c0d7ddb3f5421cc57acdb8780d48d30a54cad82", "static/images/blog/what-is-mcp/claude-mcp-tools.png": "3a5ae700867b8671b5c9e3af61b094aeb64611168463db66ff440e0d427ac6bc", "static/images/blog/what-is-mcp/cover.png": "dc4537990c91d6f1768c5ab8775e5c52239eb901b15e2e74fce8b5a018855c32", diff --git a/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc b/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc new file mode 100644 index 0000000000..e454e18dd4 --- /dev/null +++ b/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc @@ -0,0 +1,156 @@ +--- +layout: post +title: Asynchronous vs. Synchronous programming +description: Learn the difference between synchronous and asynchronous programming, how blocking and non-blocking code works, and when developers should use each. +date: 2026-07-16 +cover: /images/blog/asynchronous-vs-synchronous-programming/cover.avif +timeToRead: 5 +author: aditya-oberai +category: best-practices +featured: false +unlisted: true +faqs: + - question: Does asynchronous programming use multiple threads? + answer: Not necessarily. Some runtimes use threads, but environments such as JavaScript commonly use an event loop to coordinate asynchronous operations without running application code on multiple threads simultaneously. + - question: What is the difference between synchronous and asynchronous APIs? + answer: A synchronous API call makes the caller wait until the operation finishes and returns a result. An asynchronous API call usually returns immediately while the operation continues in the background. + - question: Is asynchronous programming faster than synchronous programming? + answer: Async does not make an individual operation faster. It improves responsiveness and throughput by preventing the program from sitting idle while waiting for network requests, database queries, or file operations. + - question: When should I use asynchronous programming? + answer: Use asynchronous programming for I/O-bound work such as API calls, database queries, file access, background jobs, and other operations that spend time waiting on external systems. + - question: When should I use synchronous programming? + answer: Use synchronous programming for quick calculations, startup tasks, simple scripts, and operations that must run in a strict order. It is often easier to read, test, and debug. +--- +Most performance problems in application code come down to one decision made early and rarely revisited: whether a piece of work runs synchronously or asynchronously. Get it wrong and a single slow network call freezes your entire request, your UI stops responding, and your server sits idle waiting on I/O it could have handled in parallel. + +The confusing part is that synchronous and asynchronous code often look almost identical. The difference is not in the syntax, it is in what happens while the work is in progress. This post breaks down synchronous vs asynchronous programming, explains how blocking and non-blocking execution actually work, and gives you a clear rule for when to reach for each. + +# What is synchronous programming? + +**Synchronous programming runs one task at a time, in order, and each task must finish before the next one starts.** The program blocks on each line until it returns a result, then moves on. + +Think of it like a single checkout line at a store. Each customer is served completely before the next one steps forward. If one customer needs a price check that takes two minutes, everyone behind them waits, even if they only have one item. + +Here is synchronous code in JavaScript: + +```javascript +const data = readFileSync('config.json'); // blocks until the file is read +const parsed = JSON.parse(data); // only runs after the read finishes +console.log(parsed); // only runs after parsing +``` + +Each line waits for the one before it. This is predictable and easy to reason about, which is exactly why it is the default mental model most developers start with. The cost shows up when one of those lines involves waiting on something slow. + +# What is asynchronous programming? + +**Asynchronous programming lets a task start and then hand control back to the program while it waits, so other work can run in the meantime.** When the task completes, the program is notified and picks up where it left off. + +Back to the store analogy: instead of blocking the line, the customer needing a price check steps aside, the cashier serves everyone else, and the first customer returns once the price is confirmed. Nobody sits idle. + +Here is the asynchronous version of the same file read: + +```javascript +const data = await readFile('config.json'); // starts the read, frees the thread +const parsed = JSON.parse(data); // runs when the read resolves +console.log(parsed); +``` + +The `await` keyword makes this read like sequential code, but under the hood the runtime is free to do other work while the file is being read. That distinction is the whole point. + +# Blocking vs non-blocking: the real distinction + +People often use "synchronous" and "blocking" interchangeably, but they describe slightly different things. + +* **Blocking** means the current thread cannot do anything else until the operation completes. It is stuck. +* **Non-blocking** means the operation returns control immediately, and the result arrives later through a callback, promise, or event. + +Synchronous code is almost always blocking. Asynchronous code is designed to be non-blocking. The reason this matters is CPU utilization. A blocked thread waiting on a database query is doing nothing useful, it is just occupying memory and a slot in your thread pool. A non-blocking model lets that same thread serve other requests while the query runs. + +This is why a single-threaded runtime like Node.js can handle thousands of concurrent connections. It is not doing many things at once on the CPU, it is refusing to sit still while waiting on I/O. + +# Synchronous vs asynchronous programming: key differences + +Here is the comparison at a glance. + +| Aspect | Synchronous | Asynchronous | +| --------------- | ------------------------------- | ----------------------------------------------- | +| Execution order | Strictly sequential | Tasks can overlap and complete out of order | +| Thread behavior | Blocks while waiting | Frees the thread while waiting | +| Complexity | Simple to read and debug | Harder to trace, needs care with error handling | +| Best for | CPU-bound and short tasks | I/O-bound and long-running tasks | +| Failure impact | One slow call stalls everything | A slow call runs in the background | +| Typical tools | Plain function calls | Promises, async/await, callbacks, events | + +The short version: synchronous code trades throughput for simplicity, and asynchronous code trades simplicity for throughput. + +# How asynchronous code works under the hood + +Asynchronous programming is not magic, and it usually does not mean multithreading. In JavaScript and many other runtimes, it is built on an **event loop**. + +When you start an async operation, the runtime offloads it (to the operating system, a thread pool, or a network layer) and registers a callback. Your code keeps running. The event loop continuously checks whether any offloaded work has finished, and when it has, it queues the callback to run as soon as the call stack is clear. + +This model is well documented if you want to go deeper. The [MDN guide to the event loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Event_loop) explains the concurrency model in the browser, and the [Node.js event loop documentation](https://nodejs.org/en/learn/asynchronous-work/event-loop-timers-and-nexttick) covers how it works on the server. + +The practical takeaway: async does not make individual operations faster. A network request takes the same amount of time either way. What async does is stop that request from wasting the time of everything else. + +# When to use synchronous programming + +Reach for synchronous code when the work is fast, CPU-bound, or when order and simplicity matter more than throughput. + +* **CPU-bound computation.** Sorting an array, transforming data in memory, or running a calculation does not wait on external systems, so making it async adds overhead with no benefit. +* **Startup and configuration.** Reading a config file once at boot is fine to do synchronously, since nothing else needs to run yet. +* **Scripts and simple tools.** A one-off migration script or CLI command is easier to write and debug as straight-line synchronous code. +* **Strict ordering.** When step two genuinely cannot begin until step one is fully done, synchronous flow expresses that intent clearly. + +The rule of thumb: if the operation does not wait on I/O and finishes quickly, synchronous is the right default. + +# When to use asynchronous programming + +Reach for asynchronous code whenever a task waits on something outside your process. + +* **Network requests.** API calls, database queries, and third-party service calls all involve waiting. Blocking on them wastes your server's capacity. +* **File and disk operations.** Reading, writing, and streaming files are I/O-bound and benefit from non-blocking execution. +* **User interfaces.** In a browser or mobile app, blocking the main thread freezes the UI. Async keeps the interface responsive while data loads. +* **Long-running background jobs.** Sending emails, processing uploads, generating reports, or running batch operations should not make the caller wait. +* **High-concurrency servers.** If you need to serve many simultaneous requests, non-blocking I/O is what lets a small number of threads handle a large number of connections. + +If you are building an application backend, most of your meaningful work is I/O-bound, which means asynchronous execution is usually the correct default there. + +# Common asynchronous programming mistakes + +Async gives you throughput, but it introduces failure modes that synchronous code does not have. Watch for these. + +* **Forgetting to await.** An un-awaited promise runs, but your code moves on without its result, leading to race conditions and silent failures. +* **Unhandled rejections.** Errors in async code do not always propagate the way you expect. Wrap awaited calls in try/catch or attach a `.catch()`. +* **Accidental serialization.** Awaiting calls one after another when they could run together wastes the whole benefit. Use `Promise.all` to run independent operations concurrently. +* **Blocking the event loop.** Running heavy CPU work inside an async runtime still blocks everything, because there is only one thread handling the loop. Offload it to a worker or a background function. + +# Handling synchronous and asynchronous work with Appwrite + +Once you move this decision from a single function into a real backend, you need infrastructure that supports both models cleanly. [Appwrite Functions](/docs/products/functions) is built around exactly this distinction. + +When you [execute a function](/docs/products/functions/execute), you choose the mode explicitly. A **synchronous execution** makes the caller wait for the result and is capped at a 30-second timeout, which suits API endpoints and short tasks where you need the response immediately. An **asynchronous execution** returns an execution ID right away and runs the work in the background, which suits long-running jobs like batch processing, email delivery, or upload post-processing. + +```javascript +const execution = await functions.createExecution({ + functionId: '', + async: true, // returns immediately, runs in the background +}); +``` + +Beyond Functions, the same non-blocking philosophy runs through the platform. [Appwrite Realtime](/docs/apis/realtime) pushes updates to clients over subscriptions instead of forcing them to poll, and [Appwrite Messaging](/docs/products/messaging) handles email, SMS, and push delivery as background work so your request path stays fast. Together they let you keep user-facing calls synchronous and responsive while heavy work happens asynchronously out of the critical path. + +To go deeper on structuring this well, read the [complete guide to Appwrite Functions](/blog/post/appwrite-functions-guide) for triggers and execution modes, and [serverless functions best practices](/blog/post/serverless-functions-best-practices) for patterns that keep async work reliable in production. + +# Getting started with Appwrite Functions + +Choosing between synchronous and asynchronous execution is not about picking a favorite. It is about matching the model to the work: synchronous for fast, CPU-bound, order-dependent tasks, and asynchronous for anything that waits on I/O or runs long. Get that mapping right and both your servers and your users stop waiting on work that never needed to block them. + +The fastest way to see it in practice is to deploy a function and try both execution modes yourself. + +* [Appwrite Functions overview](/docs/products/functions) +* [Execute a function synchronously or asynchronously](/docs/products/functions/execute) +* [Function runtimes](/docs/products/functions/runtimes) +* [A complete guide to Appwrite Functions](/blog/post/appwrite-functions-guide) +* [Serverless functions best practices](/blog/post/serverless-functions-best-practices) +* [Join the Appwrite Discord community](https://appwrite.io/discord) \ No newline at end of file diff --git a/src/routes/blog/post/what-is-crud-explained/+page.markdoc b/src/routes/blog/post/what-is-crud-explained/+page.markdoc new file mode 100644 index 0000000000..3e77cb2e68 --- /dev/null +++ b/src/routes/blog/post/what-is-crud-explained/+page.markdoc @@ -0,0 +1,162 @@ +--- +layout: post +title: What is CRUD? Explained +description: Learn what CRUD means, how Create, Read, Update, and Delete map to HTTP and SQL, and how developers use CRUD to build data-driven applications. +date: 2026-07-16 +cover: /images/blog/what-is-crud-explained/cover.avif +timeToRead: 5 +author: aditya-oberai +category: architecture +featured: false +unlisted: true +faqs: + - question: What is the difference between CRUD and REST? + answer: CRUD describes the operations performed on data. REST is an architectural style for designing networked APIs around resources and HTTP methods. A REST API can expose CRUD operations, but CRUD and REST are not the same concept. + - question: Is CRUD only used with SQL databases? + answer: No. CRUD applies to relational databases, document databases, key-value stores, file systems, APIs, and other systems that persist data. The commands may differ, but the four underlying operations remain the same. + - question: Is CRUD only used with SQL databases? + answer: No. CRUD applies to relational databases, document databases, key-value stores, file systems, APIs, and other systems that persist data. The commands may differ, but the four underlying operations remain the same. + - question: Can I build a CRUD application with Appwrite? + answer: Yes. Appwrite Databases provides SDK methods for creating, reading, updating, and deleting rows. You can combine these operations with Appwrite Auth, permissions, queries, transactions, Functions, and Realtime without building a complete backend API from scratch. +--- +**CRUD stands for Create, Read, Update, and Delete, the four basic operations you perform on stored data.** Almost every application that saves information relies on CRUD, from a to-do list to a banking system, and it forms the foundation of how developers build data-driven software. + +This guide explains what CRUD is, what each operation does, how CRUD maps to HTTP methods and SQL commands, how it works across relational and NoSQL databases, and how to build a CRUD application. It's written for developers who want a complete picture, not just a definition. + +# What does CRUD stand for? + +CRUD is an acronym for the four operations that make up the lifecycle of persistent data: + +* **Create.** Add a new record to your data store. +* **Read.** Retrieve one or more existing records. +* **Update.** Modify an existing record. +* **Delete.** Remove a record. + +You can think of CRUD as the vocabulary every application uses to talk to its database. When you sign up for an account, you **create** a record. When you view your profile, you **read** it. When you change your email, you **update** it. When you close the account, you **delete** it. Almost any feature you can name reduces to some combination of these four actions. + +The term has been around since the early days of database design, and it endures because it describes something universal. If your software stores state, it does CRUD, whether you call it that or not. + +# Why does CRUD matter? + +CRUD matters because it gives developers a shared, predictable model for working with data. Instead of inventing a new way to handle storage for every feature, you build on the same four operations everywhere. + +* **Consistency.** A single mental model covers every data-driven feature, which makes code easier to reason about and maintain. +* **Predictable APIs.** When your endpoints follow CRUD conventions, other developers can guess how they behave without reading the docs. +* **Faster development.** Many frameworks and backend platforms scaffold CRUD operations automatically, so you write less boilerplate. +* **A clear security boundary.** Mapping permissions to Create, Read, Update, and Delete makes it obvious who can do what to which data. + +Understanding CRUD also makes it easier to learn new tools. REST APIs, SQL, and most database SDKs are all organized around these operations, so once the pattern clicks, new technologies feel familiar. + +# The four CRUD operations explained + +Each CRUD operation has a distinct job, and together they cover the full lifecycle of a record. + +## Create + +Create adds a brand-new record to your data store. You provide the data, and the system assigns it an identifier and saves it. Creating a user account, posting a comment, or uploading a file all begin with a create operation. + +## Read + +Read retrieves existing data without changing it. This is the most common operation in most applications, since users view data far more often than they change it. A read can fetch a single record by its ID or return a filtered, sorted list of many records. + +## Update + +Update modifies a record that already exists. Depending on the system, an update can replace the entire record or change only specific fields. Editing a profile, marking a task as done, or changing a setting are all updates. + +## Delete + +Delete removes a record. Some systems delete data permanently, while others use a "soft delete" that marks a record as removed without erasing it, so it can be recovered or audited later. Deleting an account or removing a post are delete operations. + +# How CRUD maps to HTTP methods + +In web development, CRUD operations usually map onto the [HTTP methods](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) used by REST APIs. This mapping is why RESTful APIs feel so consistent: once you know the pattern, you can predict how any well-designed endpoint behaves. + +| CRUD operation | HTTP method | Example | +| -------------- | ---------------- | -------------------------------- | +| Create | `POST` | `POST /users` | +| Read | `GET` | `GET /users` or `GET /users/123` | +| Update | `PUT` or `PATCH` | `PUT /users/123` | +| Delete | `DELETE` | `DELETE /users/123` | + +The distinction between `PUT` and `PATCH` is worth knowing. **`PUT` replaces an entire record**, while **`PATCH` updates only the fields you send**. Using the right one keeps your API predictable and avoids accidentally wiping out data you didn't mean to touch. + +If you want to go deeper on how APIs expose these operations, our guide on [REST vs GraphQL vs WebSockets](/blog/post/rest-vs-graphql-websockets-which-is-best-for-your-app) covers the trade-offs between the main API styles. + +# How CRUD maps to SQL commands + +In relational databases, the same four operations map onto [SQL](https://www.postgresql.org/docs/current/sql-commands.html) statements. This is the layer where CRUD actually touches stored data. + +| CRUD operation | SQL command | Example | +| -------------- | ----------- | ---------------------------------------------- | +| Create | `INSERT` | `INSERT INTO users (name) VALUES ('Ada')` | +| Read | `SELECT` | `SELECT * FROM users WHERE id = 123` | +| Update | `UPDATE` | `UPDATE users SET name = 'Ada' WHERE id = 123` | +| Delete | `DELETE` | `DELETE FROM users WHERE id = 123` | + +Notice how the concept stays identical even though the syntax changes. A create is an `INSERT`, a read is a `SELECT`, and so on. This is the value of CRUD as a mental model: it stays constant across HTTP, SQL, and whatever SDK you use, so you only have to learn the mapping once. + +# CRUD in NoSQL and document databases + +CRUD isn't limited to SQL. NoSQL and document databases perform the exact same four operations, just with different terminology and data shapes. Instead of rows in tables, a document database stores flexible documents, but you still create, read, update, and delete them. + +For example, a document database SDK might expose methods like `createDocument`, `getDocument`, `updateDocument`, and `deleteDocument`. The names spell out the CRUD operation directly. If you're weighing which data model fits your project, our breakdown of [SQL vs NoSQL](/blog/post/sql-vs-nosql) explains where each one shines. + +[Appwrite Databases](/docs/products/databases) is a good example of CRUD in practice. You create rows, read them back with [queries](/docs/products/databases/queries) for filtering and sorting, update them as data changes, and delete them when they're no longer needed, all through a consistent SDK across web, mobile, and server platforms. + +# CRUD vs REST: what's the difference? + +CRUD and REST are related but not the same thing. **CRUD is a set of four operations on data, while** [REST](https://developer.mozilla.org/en-US/docs/Glossary/REST) **is an architectural style for designing web APIs.** They overlap because REST APIs commonly expose CRUD operations over HTTP, but they answer different questions. + +CRUD describes *what* you do to data: create, read, update, delete. REST describes *how* you structure an API to expose those actions, using resources, URLs, and HTTP methods. You can implement CRUD without REST, for instance directly in SQL, and a REST API can do more than plain CRUD. In practice, though, "a RESTful CRUD API" is one of the most common backend patterns you'll build. + +# Common CRUD use cases + +Because CRUD is so fundamental, it shows up nearly everywhere data is stored: + +* **User management.** Register, view, edit, and remove user accounts. +* **Content management.** Publish, display, edit, and delete posts, pages, or products. +* **To-do and task apps.** Add tasks, list them, mark them done, and remove them. +* **E-commerce.** Manage products, carts, and orders through the same four operations. +* **Admin dashboards.** Nearly every internal tool is a CRUD interface over a database. +* **Social features.** Create comments and likes, read feeds, edit posts, and delete content. + +# How to build a CRUD application + +Building a CRUD app is the fastest way to internalize the pattern, and it's a common first project for good reason. + +1. **Model your data.** Decide what a record looks like, such as a task with a title, status, and due date. +2. **Choose a data store.** Pick a relational database, a document database, or a backend platform that provides one. +3. **Implement Create and Read first.** Add a record and list records back. This gets data flowing end to end. +4. **Add Update and Delete.** Round out the four operations so records can change and be removed. +5. **Add permissions and validation.** Control who can perform each operation and reject invalid data before it's stored. +6. **Build a UI or API on top.** Expose the operations through forms, endpoints, or an SDK your frontend can call. + +A backend platform like [Appwrite](/docs) removes most of the boilerplate here, giving you a database, authentication, and permissions so you can focus on your data model instead of wiring up storage from scratch. You can follow the [quick start guides](/docs/quick-starts) to stand up a working CRUD backend in minutes. + +# CRUD best practices + +* **Validate input on create and update** so malformed or malicious data never reaches your database. +* **Enforce permissions per operation**, since who can read data is often different from who can delete it. +* **Paginate your reads** instead of returning entire tables, which protects performance as data grows. +* **Prefer `PATCH` over `PUT`** when you only need to change a few fields, to avoid overwriting data unintentionally. +* **Consider soft deletes** for important records, marking them removed rather than erasing them, so you keep an audit trail. +* **Use transactions** when several operations must succeed or fail together, keeping your data consistent. + +# Conclusion + +CRUD stands for Create, Read, Update, and Delete, the four operations that define how applications work with stored data. Understanding its core pieces, namely the four operations themselves, how they map onto HTTP methods and SQL commands, and how the same model carries across relational and NoSQL databases, gives you a foundation that applies to almost every backend you'll ever build. Because nearly all software stores state, CRUD is one of the most useful patterns a developer can master. The best way to learn it is to build a small CRUD app, wire up all four operations end to end, and watch data flow from your UI to your database and back. + +# Building CRUD apps with Appwrite + +[Appwrite Databases](/docs/products/databases) gives you a complete CRUD backend without the boilerplate. You create rows, read them with powerful [queries](/docs/products/databases/queries), update them as your data changes, and delete them when they're done, all through a consistent SDK across web, mobile, Flutter, and server platforms. Fine-grained [permissions](/docs/products/databases/permissions) let you control exactly who can perform each operation, and [transactions](/docs/products/databases/transactions) keep multi-step changes consistent. + +Whether you're prototyping a to-do app or scaling a production system, Appwrite gives you Auth, Databases, Storage, Functions, Sites, and Realtime in one open-source platform. [Sign up for Appwrite Cloud](https://cloud.appwrite.io/) or spin up a self-hosted instance in minutes, and give your next build a real backend to grow on. + +## Resources + +* [Appwrite Databases documentation](/docs/products/databases) +* [Appwrite Databases queries](/docs/products/databases/queries) +* [Appwrite quick start guides](/docs/quick-starts) +* [SQL vs NoSQL: how to choose](/blog/post/sql-vs-nosql) +* [Appwrite on GitHub](https://github.com/appwrite/appwrite) +* [Join the Appwrite Discord](https://appwrite.io/discord) \ No newline at end of file diff --git a/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc b/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc new file mode 100644 index 0000000000..08de90ed67 --- /dev/null +++ b/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc @@ -0,0 +1,126 @@ +--- +layout: post +title: What is MCP? A complete guide for developers +description: Learn what MCP is, how Model Context Protocol works, its architecture, tools, resources, prompts, APIs, and how developers can start building with it. +date: 2026-07-16 +cover: /images/blog/what-is-mcp-a-complete-guide-for-developers/cover.avif +timeToRead: 5 +author: aditya-oberai +category: ai +featured: false +unlisted: true +faqs: + - question: What is the difference between an MCP client and an MCP server? + answer: An MCP client connects an AI application to one MCP server and manages communication with it. The server exposes the tools, resources, and prompts that the AI application can use. + - question: What is the difference between MCP and an API? + answer: An API defines how software interacts with a particular service. MCP provides a standard way for AI applications to discover and use many tools, often by placing an MCP server in front of existing APIs. MCP complements APIs rather than replacing them. + - question: Do I need an MCP server to use MCP? + answer: You need access to an MCP server, but you do not always need to build one yourself. You can connect an existing server to a compatible AI client or create your own when exposing a custom product, API, or internal data source. + - question: Is MCP secure? + answer: MCP can support authorization for remote HTTP servers, but connecting a server still gives an AI application access to potentially sensitive tools and data. Developers should use narrowly scoped credentials, validate inputs, require approval for sensitive actions, and only connect trusted servers. +--- +AI models are good at reasoning and terrible at acting. Ask one to summarize your latest report, check today's database entries, or open a pull request, and it stalls. It has no way to reach your files, your database, or your APIs. It can only work with what was in its training data. + +For a while, the fix was custom integrations: write glue code for every tool, handle each authentication scheme, and rewrite it all when an API changes. That does not scale. **Model Context Protocol (MCP)** is the standard that replaces those one-off integrations with a single, shared interface. + +This guide covers what MCP is, how its architecture and primitives work, the transports it runs over, and how you can start building with it today. + +# What is MCP (Model Context Protocol)? + +MCP is an open protocol that defines how AI applications connect to external tools, data sources, and APIs through a uniform interface. Instead of teaching a model a new integration for every service, you expose your capabilities through an **MCP server**, and any MCP-compatible client can use them. + +MCP was developed by [Anthropic](https://www.anthropic.com/news/model-context-protocol) and released as an open standard in November 2024. It has since been adopted across IDE assistants, desktop clients, and backend platforms, and the specification is maintained openly at [modelcontextprotocol.io](https://modelcontextprotocol.io). + +The short version: MCP turns a model that can only think into one that can fetch real data and trigger real actions, without you writing bespoke plumbing for each connection. + +# Why MCP exists: the integration problem + +The problem MCP solves is combinatorial. If you have **M** AI applications and **N** tools, connecting them directly means building and maintaining M × N integrations. Every new tool multiplies the work, and every API change breaks something downstream. + +MCP collapses that to **M + N**. Each tool ships one MCP server, each AI application speaks MCP once, and the two sides interoperate without knowing anything specific about each other. You build the integration once and it works everywhere. + +This is the same shift the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) brought to code editors. Before LSP, every editor needed custom support for every language. After it, one language server worked in any compatible editor. MCP applies that pattern to AI applications and the tools they need to reach. + +# How MCP works: architecture + +MCP uses a client-server architecture with three roles. Understanding the split is the key to reasoning about how everything connects. + +* **Host**: The AI application the user interacts with, such as Claude Desktop, Cursor, or VS Code. The host manages one or more clients. +* **Client**: A connector that lives inside the host and maintains a dedicated one-to-one connection to a single server. +* **Server**: A program that exposes capabilities (tools, data, and prompts) over MCP. A GitHub server exposes repo operations, a database server exposes queries, and so on. + +A single host can run many clients at once, each connected to a different server. That is how one assistant can pull errors from Sentry, read commits from GitHub, and write to your backend in the same conversation, with each server handling only its own domain. + +Under the hood, MCP is built on [JSON-RPC 2.0](https://www.jsonrpc.org/specification). Clients and servers exchange structured request and response messages, and the connection begins with an initialization handshake where both sides declare which features they support. + +# MCP primitives: tools, resources, and prompts + +MCP servers expose their capabilities through three primitives. Knowing which one to reach for is most of what you need to design a good server. + +* **Tools** are executable functions the model can call to perform an action: run a query, send a message, create a record. Tools are model-controlled, meaning the AI decides when to invoke them based on the task. +* **Resources** are read-only data the server makes available for context: files, database rows, documentation, or API responses. Resources are application-controlled and give the model something to reason over. +* **Prompts** are reusable, templated instructions that a server offers to standardize common workflows. Prompts are typically user-controlled, surfaced as slash commands or menu options in the client. + +The distinction matters in practice. A weather server might expose a `get_forecast` **tool** for live lookups, a **resource** listing saved locations, and a **prompt** that formats a daily briefing. Each primitive has a different trigger and a different level of control. + +Clients contribute their own primitives back to servers, including **sampling** (letting a server request a model completion), **roots** (scoping which files or directories a server may access), and **elicitation** (asking the user for input mid-task). Together these keep the human and the model in the loop rather than handing servers unchecked access. + +# MCP transports and APIs + +MCP defines two standard transports for how clients and servers actually talk to each other. + +* **stdio**: The server runs as a local subprocess and communicates over standard input and output. This is the simplest and most common setup for local tools, since credentials never leave your machine. +* **Streamable HTTP**: The server runs as a remote service reachable over HTTP, with support for streaming responses. This is the transport for hosted servers and replaced the earlier HTTP with Server-Sent Events approach. + +Because MCP standardizes the message format above the transport, the same server logic works whether it runs locally over stdio or remotely over HTTP. You write your tool and resource handlers once, then choose how to deploy. + +# MCP vs REST APIs: what is the difference? + +A common question is whether MCP is just another API. It is not, and the difference is about layers. + +A REST API is one specific contract for one specific service. MCP is a protocol layer above that. It defines how an AI client discovers available tools, inspects their input schemas, and calls them in a consistent way, regardless of what sits underneath. The MCP server still talks to the real REST APIs and databases. The model only has to learn MCP once instead of learning every API individually. + +In other words, REST answers "how do I call this one service," while MCP answers "how does an AI application discover and use any tool that has been exposed to it." They are complementary, not competing. + +# What can you do with MCP? + +MCP is already in production across everyday developer workflows, not just demos. A few concrete examples: + +* **AI-assisted coding.** Editors like Cursor, Zed, and VS Code connect to servers that read your repo, check recent commits, and query your backend, so the assistant reasons over real project context instead of guessing. +* **Debugging and operations.** An assistant can pull recent errors from a Sentry server, cross-reference the failing deployment on a Vercel server, and inspect the offending commit on GitHub, all in one thread. +* **Internal knowledge and data.** Teams expose sales figures, inventory, or customer records through a server so employees can ask questions in plain language and get answers backed by live data. +* **Backend management.** With a server for your cloud platform, an agent can create users, run migrations, and deploy functions without you leaving the chat. + +The common thread is that each of these used to require custom integration work. MCP makes the capability portable across every client that speaks the protocol. + +# How to start building with MCP + +You do not need to implement the protocol by hand. The MCP project ships official [SDKs](https://modelcontextprotocol.io/docs/sdk) for TypeScript, Python, and other languages that handle the JSON-RPC layer, the handshake, and the transport for you. Building a server usually comes down to declaring your tools, resources, and prompts and wiring them to real logic. + +If you are using MCP rather than authoring a server, the workflow is simpler: pick a client, point it at a server, and start prompting. The client handles discovery and tool calls automatically. + +Two good ways to get hands-on: + +* **Use existing servers.** Attach servers for the tools you already work with. Our roundup of the [best MCP servers and clients](/blog/post/10-best-mcp-server-client) is a good starting point for what is available. +* **Connect your backend.** If you build on Appwrite, the [Appwrite MCP server](/docs/tooling/ai/mcp-servers/api) exposes your project to any MCP-compatible client so an AI agent can manage [Databases](/docs/products/databases), create users through [Auth](/docs/products/auth), upload files to [Storage](/docs/products/storage), and deploy [Functions](/docs/products/functions) directly from a chat. + +# A note on security + +MCP itself is just the protocol; security depends entirely on how a server is configured and what credentials it holds. Treat every MCP server like a privileged backend service. + +Scope API keys to the minimum permissions the task needs, prefer local stdio servers when you want credentials to stay on your machine, and use staging projects for exploratory work. Before connecting any server, audit which tools it exposes. An MCP server is only as safe as the access you hand it. + +# Getting started with the Appwrite MCP server + +MCP is the layer that lets AI applications actually do things instead of only describing them. Once you understand the architecture, the three primitives, and the transports, most servers become predictable to reason about and straightforward to build. + +The fastest way to see it in action is to connect your own backend. The Appwrite MCP server exposes your entire project to AI coding agents through a compact two-tool architecture, so you can create users, query databases, and deploy functions from within Claude Code, Cursor, or any MCP client. Read [how we rebuilt it in MCP Server 2.0](/blog/post/announcing-appwrite-mcp-server-2), then follow the docs to add it to your setup. + +# Resources + +* [Appwrite MCP server documentation](/docs/tooling/ai/mcp-servers/api) +* [Appwrite Docs MCP server](/docs/tooling/ai/mcp-servers/docs) +* [What exactly is MCP, and why is it trending?](/blog/post/what-is-mcp) +* [10 awesome MCP servers and clients for developers](/blog/post/10-best-mcp-server-client) +* [Official MCP specification](https://modelcontextprotocol.io) +* [Join the Appwrite Discord community](https://appwrite.io/discord) \ No newline at end of file diff --git a/static/images/blog/asynchronous-vs-synchronous-programming/cover.avif b/static/images/blog/asynchronous-vs-synchronous-programming/cover.avif new file mode 100644 index 0000000000000000000000000000000000000000..13cce2d2620f1d01c04848273177f6290f43d485 GIT binary patch literal 22806 zcmYJa1FR^)(lxqm+qP}nwr$(CZR>2?wym>m+r~Th-uLCNWD2WlWu`hk$z-}40002T z%*E5e(9O~e;Gfu9nlb*zx3x6<7Xv!jnz|VN2mdF87A7`M|8oHV94w7p{?GqE3+G_z zV*B3!@SkR}w6Qn-Pb4A$00i(K1OPDQe-;2ho%kR2Pc+*84*}5s7jjry+Wq%2{+mVp z7nuIH>>u0Eje+q$jQ0oUC&%zkGF$xEg{+Ekl>Fi+oA0_|* z=)VhS?w>+%u=KF}4+0DU0rAiLuO1ZVKhVD}{+9#%Plm(L)kF9{u&a|Dm#u@T`G1uV zm$9X>1DCU>vx}*%GuOWwOB+i=Cr>Uz8wZR3ju)<_gYAEvf7E~70|x>D0|0@90D*@6 z1F$TeO#j#BzuWyI+x&Nc{xzu{Wou&Sf&>5s#c5^!ojVAG1xvt`SPO^?QV$41kthH_ zN4T@Klf*qaNbOH9{pjfiNhXv4{zt2NF9JYu6Pic#Yy9EVa#49&+8S#*wX)k^Daao` z1OQ(0mEA2P(7wyS!ef-EVOfP?B~0Og0TMjfW8>Q1Xtg)t>2kO8wt%5v9ECW8#pdT7 zb|_q5OtHGdBxt2P@*I+0HK{*Y_Z1&DUq?fu1=Q(xB$igaN@-qA&(X+4N|$#wcMV>K@e0=#QDF~^Pi zp)l!=s1OceZnG(zO~;5gI)H;Xc$IPP5&_I|pWOLq%SXe}q=;n$PyB$txd?733Jb7#`CFKZB3Ow&!avj-S;z0X9CBs@uw-|gL3_IbSu|TN zJQ+3h2q@_Xb8-UsVg^twcbRFK* z0aQ?OvO)4@Q8&FWKyl*1#gP8DMU0}t8Ehm;N`9n&ebEd8B=#XEQ^UU>`= zt5zN}uNR*w0&ja$)*suj3PBXQNxLADR6-~w>p1#je(Dv|o6mfO^E8}2%O4JquqB&C zfDd;ws*^E{3U>s>snc4vm7{(?vNti)^nL~iLBdNiWI6xv-=JzZy?B|x(ZHbz!!HOW z`le+(x1Gpu9e_+Tw2(3Dv#f2eAWxi3?orMT#+0oHDEFY+2S3$bOMr?hzA<`@!u5~7 zoAYwFB=!|w)v{AJm6SX`*s{P|`qNVtF_zX=6_)<3X;xpXNZ1

J^qfGiHy!>}w-k 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 U|9=z8|G2yVKkxr(|7Yoc0VMOeA^-pY literal 0 HcmV?d00001 diff --git a/static/images/blog/what-is-crud-explained/cover.avif b/static/images/blog/what-is-crud-explained/cover.avif new file mode 100644 index 0000000000000000000000000000000000000000..f40db7cb03a00e50b5fe61f6866297d56580c61b GIT binary patch literal 14322 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 V3;6$K;Qzz!{{OiDhyCBC{{tx?Cffi2 literal 0 HcmV?d00001 diff --git a/static/images/blog/what-is-mcp-a-complete-guide-for-developers/cover.avif b/static/images/blog/what-is-mcp-a-complete-guide-for-developers/cover.avif new file mode 100644 index 0000000000000000000000000000000000000000..3d2375d312f810c57ba97513ea3a0b1fbc414778 GIT binary patch literal 23529 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 literal 0 HcmV?d00001 From f514de2d7b2e5c1cb91ee9f95fb287039f215070 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Thu, 16 Jul 2026 14:15:30 +0530 Subject: [PATCH 2/9] Update +page.markdoc --- src/routes/blog/post/what-is-crud-explained/+page.markdoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/blog/post/what-is-crud-explained/+page.markdoc b/src/routes/blog/post/what-is-crud-explained/+page.markdoc index 3e77cb2e68..1ee5f46561 100644 --- a/src/routes/blog/post/what-is-crud-explained/+page.markdoc +++ b/src/routes/blog/post/what-is-crud-explained/+page.markdoc @@ -14,8 +14,8 @@ faqs: answer: CRUD describes the operations performed on data. REST is an architectural style for designing networked APIs around resources and HTTP methods. A REST API can expose CRUD operations, but CRUD and REST are not the same concept. - question: Is CRUD only used with SQL databases? answer: No. CRUD applies to relational databases, document databases, key-value stores, file systems, APIs, and other systems that persist data. The commands may differ, but the four underlying operations remain the same. - - question: Is CRUD only used with SQL databases? - answer: No. CRUD applies to relational databases, document databases, key-value stores, file systems, APIs, and other systems that persist data. The commands may differ, but the four underlying operations remain the same. + - question: What does CRUD stand for? + answer: CRUD stands for Create, Read, Update, and Delete. These are the four fundamental operations applications use to add, retrieve, modify, and remove stored data. - question: Can I build a CRUD application with Appwrite? answer: Yes. Appwrite Databases provides SDK methods for creating, reading, updating, and deleting rows. You can combine these operations with Appwrite Auth, permissions, queries, transactions, Functions, and Realtime without building a complete backend API from scratch. --- @@ -159,4 +159,4 @@ Whether you're prototyping a to-do app or scaling a production system, Appwrite * [Appwrite quick start guides](/docs/quick-starts) * [SQL vs NoSQL: how to choose](/blog/post/sql-vs-nosql) * [Appwrite on GitHub](https://github.com/appwrite/appwrite) -* [Join the Appwrite Discord](https://appwrite.io/discord) \ No newline at end of file +* [Join the Appwrite Discord](https://appwrite.io/discord) From 7516d0985487ae9cd874a5f34d3147293d1feb04 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Thu, 16 Jul 2026 14:36:54 +0530 Subject: [PATCH 3/9] Apply suggestion from @aishwaripahwa12 --- .../what-is-mcp-a-complete-guide-for-developers/+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc b/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc index 08de90ed67..b6354c51d7 100644 --- a/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc +++ b/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc @@ -104,7 +104,7 @@ Two good ways to get hands-on: * **Use existing servers.** Attach servers for the tools you already work with. Our roundup of the [best MCP servers and clients](/blog/post/10-best-mcp-server-client) is a good starting point for what is available. * **Connect your backend.** If you build on Appwrite, the [Appwrite MCP server](/docs/tooling/ai/mcp-servers/api) exposes your project to any MCP-compatible client so an AI agent can manage [Databases](/docs/products/databases), create users through [Auth](/docs/products/auth), upload files to [Storage](/docs/products/storage), and deploy [Functions](/docs/products/functions) directly from a chat. -# A note on security +# MCP security best practices MCP itself is just the protocol; security depends entirely on how a server is configured and what credentials it holds. Treat every MCP server like a privileged backend service. From 31b78adfa7ccbd485b843ce7a4828315ab507b97 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Thu, 16 Jul 2026 14:37:06 +0530 Subject: [PATCH 4/9] Apply suggestion from @aishwaripahwa12 --- .../what-is-mcp-a-complete-guide-for-developers/+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc b/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc index b6354c51d7..d15bfcbb1b 100644 --- a/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc +++ b/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc @@ -41,7 +41,7 @@ MCP collapses that to **M + N**. Each tool ships one MCP server, each AI applica This is the same shift the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) brought to code editors. Before LSP, every editor needed custom support for every language. After it, one language server worked in any compatible editor. MCP applies that pattern to AI applications and the tools they need to reach. -# How MCP works: architecture +# How MCP works: Architecture MCP uses a client-server architecture with three roles. Understanding the split is the key to reasoning about how everything connects. From 58a8742b28c95848d8a897431f3e6edff8ed8901 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Thu, 16 Jul 2026 14:37:35 +0530 Subject: [PATCH 5/9] Apply suggestion from @aishwaripahwa12 --- .../what-is-mcp-a-complete-guide-for-developers/+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc b/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc index d15bfcbb1b..4f48bfda83 100644 --- a/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc +++ b/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc @@ -74,7 +74,7 @@ MCP defines two standard transports for how clients and servers actually talk to Because MCP standardizes the message format above the transport, the same server logic works whether it runs locally over stdio or remotely over HTTP. You write your tool and resource handlers once, then choose how to deploy. -# MCP vs REST APIs: what is the difference? +# MCP vs REST APIs: What is the difference? A common question is whether MCP is just another API. It is not, and the difference is about layers. From 716f2bd0efda9ee7a3072a0b0e4c23d1f6157e64 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Thu, 16 Jul 2026 14:37:47 +0530 Subject: [PATCH 6/9] Apply suggestion from @aishwaripahwa12 --- .../what-is-mcp-a-complete-guide-for-developers/+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc b/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc index 4f48bfda83..fad86249ea 100644 --- a/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc +++ b/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc @@ -33,7 +33,7 @@ MCP was developed by [Anthropic](https://www.anthropic.com/news/model-context-pr The short version: MCP turns a model that can only think into one that can fetch real data and trigger real actions, without you writing bespoke plumbing for each connection. -# Why MCP exists: the integration problem +# Why MCP exists: The integration problem The problem MCP solves is combinatorial. If you have **M** AI applications and **N** tools, connecting them directly means building and maintaining M × N integrations. Every new tool multiplies the work, and every API change breaks something downstream. From cb9ae0be162340bde19b5a07e155aa7a03b04496 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Thu, 16 Jul 2026 14:37:58 +0530 Subject: [PATCH 7/9] Apply suggestion from @aishwaripahwa12 --- .../what-is-mcp-a-complete-guide-for-developers/+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc b/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc index fad86249ea..32e48ad1bb 100644 --- a/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc +++ b/src/routes/blog/post/what-is-mcp-a-complete-guide-for-developers/+page.markdoc @@ -53,7 +53,7 @@ A single host can run many clients at once, each connected to a different server Under the hood, MCP is built on [JSON-RPC 2.0](https://www.jsonrpc.org/specification). Clients and servers exchange structured request and response messages, and the connection begins with an initialization handshake where both sides declare which features they support. -# MCP primitives: tools, resources, and prompts +# MCP primitives: Tools, resources, and prompts MCP servers expose their capabilities through three primitives. Knowing which one to reach for is most of what you need to design a good server. From de7b8607d0c3b29daf0bfa860ad5ff3abe44fc29 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Fri, 17 Jul 2026 13:55:15 +0530 Subject: [PATCH 8/9] Delete src/routes/blog/post/what-is-crud-explained/+page.markdoc --- .../post/what-is-crud-explained/+page.markdoc | 162 ------------------ 1 file changed, 162 deletions(-) delete mode 100644 src/routes/blog/post/what-is-crud-explained/+page.markdoc diff --git a/src/routes/blog/post/what-is-crud-explained/+page.markdoc b/src/routes/blog/post/what-is-crud-explained/+page.markdoc deleted file mode 100644 index 1ee5f46561..0000000000 --- a/src/routes/blog/post/what-is-crud-explained/+page.markdoc +++ /dev/null @@ -1,162 +0,0 @@ ---- -layout: post -title: What is CRUD? Explained -description: Learn what CRUD means, how Create, Read, Update, and Delete map to HTTP and SQL, and how developers use CRUD to build data-driven applications. -date: 2026-07-16 -cover: /images/blog/what-is-crud-explained/cover.avif -timeToRead: 5 -author: aditya-oberai -category: architecture -featured: false -unlisted: true -faqs: - - question: What is the difference between CRUD and REST? - answer: CRUD describes the operations performed on data. REST is an architectural style for designing networked APIs around resources and HTTP methods. A REST API can expose CRUD operations, but CRUD and REST are not the same concept. - - question: Is CRUD only used with SQL databases? - answer: No. CRUD applies to relational databases, document databases, key-value stores, file systems, APIs, and other systems that persist data. The commands may differ, but the four underlying operations remain the same. - - question: What does CRUD stand for? - answer: CRUD stands for Create, Read, Update, and Delete. These are the four fundamental operations applications use to add, retrieve, modify, and remove stored data. - - question: Can I build a CRUD application with Appwrite? - answer: Yes. Appwrite Databases provides SDK methods for creating, reading, updating, and deleting rows. You can combine these operations with Appwrite Auth, permissions, queries, transactions, Functions, and Realtime without building a complete backend API from scratch. ---- -**CRUD stands for Create, Read, Update, and Delete, the four basic operations you perform on stored data.** Almost every application that saves information relies on CRUD, from a to-do list to a banking system, and it forms the foundation of how developers build data-driven software. - -This guide explains what CRUD is, what each operation does, how CRUD maps to HTTP methods and SQL commands, how it works across relational and NoSQL databases, and how to build a CRUD application. It's written for developers who want a complete picture, not just a definition. - -# What does CRUD stand for? - -CRUD is an acronym for the four operations that make up the lifecycle of persistent data: - -* **Create.** Add a new record to your data store. -* **Read.** Retrieve one or more existing records. -* **Update.** Modify an existing record. -* **Delete.** Remove a record. - -You can think of CRUD as the vocabulary every application uses to talk to its database. When you sign up for an account, you **create** a record. When you view your profile, you **read** it. When you change your email, you **update** it. When you close the account, you **delete** it. Almost any feature you can name reduces to some combination of these four actions. - -The term has been around since the early days of database design, and it endures because it describes something universal. If your software stores state, it does CRUD, whether you call it that or not. - -# Why does CRUD matter? - -CRUD matters because it gives developers a shared, predictable model for working with data. Instead of inventing a new way to handle storage for every feature, you build on the same four operations everywhere. - -* **Consistency.** A single mental model covers every data-driven feature, which makes code easier to reason about and maintain. -* **Predictable APIs.** When your endpoints follow CRUD conventions, other developers can guess how they behave without reading the docs. -* **Faster development.** Many frameworks and backend platforms scaffold CRUD operations automatically, so you write less boilerplate. -* **A clear security boundary.** Mapping permissions to Create, Read, Update, and Delete makes it obvious who can do what to which data. - -Understanding CRUD also makes it easier to learn new tools. REST APIs, SQL, and most database SDKs are all organized around these operations, so once the pattern clicks, new technologies feel familiar. - -# The four CRUD operations explained - -Each CRUD operation has a distinct job, and together they cover the full lifecycle of a record. - -## Create - -Create adds a brand-new record to your data store. You provide the data, and the system assigns it an identifier and saves it. Creating a user account, posting a comment, or uploading a file all begin with a create operation. - -## Read - -Read retrieves existing data without changing it. This is the most common operation in most applications, since users view data far more often than they change it. A read can fetch a single record by its ID or return a filtered, sorted list of many records. - -## Update - -Update modifies a record that already exists. Depending on the system, an update can replace the entire record or change only specific fields. Editing a profile, marking a task as done, or changing a setting are all updates. - -## Delete - -Delete removes a record. Some systems delete data permanently, while others use a "soft delete" that marks a record as removed without erasing it, so it can be recovered or audited later. Deleting an account or removing a post are delete operations. - -# How CRUD maps to HTTP methods - -In web development, CRUD operations usually map onto the [HTTP methods](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) used by REST APIs. This mapping is why RESTful APIs feel so consistent: once you know the pattern, you can predict how any well-designed endpoint behaves. - -| CRUD operation | HTTP method | Example | -| -------------- | ---------------- | -------------------------------- | -| Create | `POST` | `POST /users` | -| Read | `GET` | `GET /users` or `GET /users/123` | -| Update | `PUT` or `PATCH` | `PUT /users/123` | -| Delete | `DELETE` | `DELETE /users/123` | - -The distinction between `PUT` and `PATCH` is worth knowing. **`PUT` replaces an entire record**, while **`PATCH` updates only the fields you send**. Using the right one keeps your API predictable and avoids accidentally wiping out data you didn't mean to touch. - -If you want to go deeper on how APIs expose these operations, our guide on [REST vs GraphQL vs WebSockets](/blog/post/rest-vs-graphql-websockets-which-is-best-for-your-app) covers the trade-offs between the main API styles. - -# How CRUD maps to SQL commands - -In relational databases, the same four operations map onto [SQL](https://www.postgresql.org/docs/current/sql-commands.html) statements. This is the layer where CRUD actually touches stored data. - -| CRUD operation | SQL command | Example | -| -------------- | ----------- | ---------------------------------------------- | -| Create | `INSERT` | `INSERT INTO users (name) VALUES ('Ada')` | -| Read | `SELECT` | `SELECT * FROM users WHERE id = 123` | -| Update | `UPDATE` | `UPDATE users SET name = 'Ada' WHERE id = 123` | -| Delete | `DELETE` | `DELETE FROM users WHERE id = 123` | - -Notice how the concept stays identical even though the syntax changes. A create is an `INSERT`, a read is a `SELECT`, and so on. This is the value of CRUD as a mental model: it stays constant across HTTP, SQL, and whatever SDK you use, so you only have to learn the mapping once. - -# CRUD in NoSQL and document databases - -CRUD isn't limited to SQL. NoSQL and document databases perform the exact same four operations, just with different terminology and data shapes. Instead of rows in tables, a document database stores flexible documents, but you still create, read, update, and delete them. - -For example, a document database SDK might expose methods like `createDocument`, `getDocument`, `updateDocument`, and `deleteDocument`. The names spell out the CRUD operation directly. If you're weighing which data model fits your project, our breakdown of [SQL vs NoSQL](/blog/post/sql-vs-nosql) explains where each one shines. - -[Appwrite Databases](/docs/products/databases) is a good example of CRUD in practice. You create rows, read them back with [queries](/docs/products/databases/queries) for filtering and sorting, update them as data changes, and delete them when they're no longer needed, all through a consistent SDK across web, mobile, and server platforms. - -# CRUD vs REST: what's the difference? - -CRUD and REST are related but not the same thing. **CRUD is a set of four operations on data, while** [REST](https://developer.mozilla.org/en-US/docs/Glossary/REST) **is an architectural style for designing web APIs.** They overlap because REST APIs commonly expose CRUD operations over HTTP, but they answer different questions. - -CRUD describes *what* you do to data: create, read, update, delete. REST describes *how* you structure an API to expose those actions, using resources, URLs, and HTTP methods. You can implement CRUD without REST, for instance directly in SQL, and a REST API can do more than plain CRUD. In practice, though, "a RESTful CRUD API" is one of the most common backend patterns you'll build. - -# Common CRUD use cases - -Because CRUD is so fundamental, it shows up nearly everywhere data is stored: - -* **User management.** Register, view, edit, and remove user accounts. -* **Content management.** Publish, display, edit, and delete posts, pages, or products. -* **To-do and task apps.** Add tasks, list them, mark them done, and remove them. -* **E-commerce.** Manage products, carts, and orders through the same four operations. -* **Admin dashboards.** Nearly every internal tool is a CRUD interface over a database. -* **Social features.** Create comments and likes, read feeds, edit posts, and delete content. - -# How to build a CRUD application - -Building a CRUD app is the fastest way to internalize the pattern, and it's a common first project for good reason. - -1. **Model your data.** Decide what a record looks like, such as a task with a title, status, and due date. -2. **Choose a data store.** Pick a relational database, a document database, or a backend platform that provides one. -3. **Implement Create and Read first.** Add a record and list records back. This gets data flowing end to end. -4. **Add Update and Delete.** Round out the four operations so records can change and be removed. -5. **Add permissions and validation.** Control who can perform each operation and reject invalid data before it's stored. -6. **Build a UI or API on top.** Expose the operations through forms, endpoints, or an SDK your frontend can call. - -A backend platform like [Appwrite](/docs) removes most of the boilerplate here, giving you a database, authentication, and permissions so you can focus on your data model instead of wiring up storage from scratch. You can follow the [quick start guides](/docs/quick-starts) to stand up a working CRUD backend in minutes. - -# CRUD best practices - -* **Validate input on create and update** so malformed or malicious data never reaches your database. -* **Enforce permissions per operation**, since who can read data is often different from who can delete it. -* **Paginate your reads** instead of returning entire tables, which protects performance as data grows. -* **Prefer `PATCH` over `PUT`** when you only need to change a few fields, to avoid overwriting data unintentionally. -* **Consider soft deletes** for important records, marking them removed rather than erasing them, so you keep an audit trail. -* **Use transactions** when several operations must succeed or fail together, keeping your data consistent. - -# Conclusion - -CRUD stands for Create, Read, Update, and Delete, the four operations that define how applications work with stored data. Understanding its core pieces, namely the four operations themselves, how they map onto HTTP methods and SQL commands, and how the same model carries across relational and NoSQL databases, gives you a foundation that applies to almost every backend you'll ever build. Because nearly all software stores state, CRUD is one of the most useful patterns a developer can master. The best way to learn it is to build a small CRUD app, wire up all four operations end to end, and watch data flow from your UI to your database and back. - -# Building CRUD apps with Appwrite - -[Appwrite Databases](/docs/products/databases) gives you a complete CRUD backend without the boilerplate. You create rows, read them with powerful [queries](/docs/products/databases/queries), update them as your data changes, and delete them when they're done, all through a consistent SDK across web, mobile, Flutter, and server platforms. Fine-grained [permissions](/docs/products/databases/permissions) let you control exactly who can perform each operation, and [transactions](/docs/products/databases/transactions) keep multi-step changes consistent. - -Whether you're prototyping a to-do app or scaling a production system, Appwrite gives you Auth, Databases, Storage, Functions, Sites, and Realtime in one open-source platform. [Sign up for Appwrite Cloud](https://cloud.appwrite.io/) or spin up a self-hosted instance in minutes, and give your next build a real backend to grow on. - -## Resources - -* [Appwrite Databases documentation](/docs/products/databases) -* [Appwrite Databases queries](/docs/products/databases/queries) -* [Appwrite quick start guides](/docs/quick-starts) -* [SQL vs NoSQL: how to choose](/blog/post/sql-vs-nosql) -* [Appwrite on GitHub](https://github.com/appwrite/appwrite) -* [Join the Appwrite Discord](https://appwrite.io/discord) From 1eada5add71b2a400a660265096387d49aed279a Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Fri, 17 Jul 2026 13:55:47 +0530 Subject: [PATCH 9/9] Delete static/images/blog/what-is-crud-explained/cover.avif --- .../blog/what-is-crud-explained/cover.avif | Bin 14322 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 static/images/blog/what-is-crud-explained/cover.avif diff --git a/static/images/blog/what-is-crud-explained/cover.avif b/static/images/blog/what-is-crud-explained/cover.avif deleted file mode 100644 index f40db7cb03a00e50b5fe61f6866297d56580c61b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14322 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 V3;6$K;Qzz!{{OiDhyCBC{{tx?Cffi2