From f8f125ceb56c49c6a574d6c62507c2d78bf0f6b4 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Thu, 16 Jul 2026 13:52:15 +0530 Subject: [PATCH 01/25] 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 02/25] 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 03/25] 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 04/25] 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 05/25] 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 06/25] 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 07/25] 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 08/25] 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 09/25] 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 From efbfae268229524076af99795cef85add044ca3e Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Fri, 24 Jul 2026 17:47:34 +0530 Subject: [PATCH 10/25] Apply suggestion from @adityaoberai Co-authored-by: Aditya Oberai --- .../post/asynchronous-vs-synchronous-programming/+page.markdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc b/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc index e454e18dd4..9ab0cc2696 100644 --- a/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc +++ b/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc @@ -21,6 +21,7 @@ faqs: - 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. From 6b48532276c07a88255f2507d71b6601f8343ede Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Fri, 24 Jul 2026 17:47:50 +0530 Subject: [PATCH 11/25] Apply suggestion from @adityaoberai Co-authored-by: Aditya Oberai --- .../what-is-mcp-a-complete-guide-for-developers/+page.markdoc | 1 + 1 file changed, 1 insertion(+) 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 32e48ad1bb..78bff0d986 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 @@ -19,6 +19,7 @@ faqs: - 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. From d889fd3d4c3edc4ac6f936f317d7231c68d3d05d Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Fri, 24 Jul 2026 18:09:58 +0530 Subject: [PATCH 12/25] Update +page.markdoc --- .../+page.markdoc | 51 +++++++++++++++---- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc b/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc index 9ab0cc2696..6ed2a0f243 100644 --- a/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc +++ b/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc @@ -126,32 +126,63 @@ Async gives you throughput, but it introduces failure modes that synchronous cod * **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 +# Using async functions with Appwrite SDKs -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. +Appwrite SDK methods are asynchronous because most operations involve making a network request and waiting for a response. In JavaScript and TypeScript, methods for authentication, databases, storage, and other Appwrite services return promises that you can handle using `async` and `await`. -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 user = await account.get(); + +const documents = await databases.listDocuments({ + databaseId: '', + collectionId: '', +}); +``` + +This gives developers readable, sequential-looking code without blocking the application while the request is in progress. + +When multiple Appwrite requests do not depend on one another, you can run them concurrently with `Promise.all()` instead of waiting for each one separately. + +```javascript +const [user, documents] = await Promise.all([ + account.get(), + databases.listDocuments({ + databaseId: '', + collectionId: '', + }), +]); +``` + +The same async programming principles apply when using Appwrite: await an operation when the next step depends on its result, and run independent requests concurrently when it is safe to do so. + +# Synchronous and asynchronous Appwrite Function executions + +[Appwrite Functions](/docs/products/functions) introduce another execution choice: whether Appwrite should wait for the function to finish before returning a response. + +A synchronous execution keeps the request open until the function completes and returns its result. This works well for short operations where the caller needs the output immediately. + +An asynchronous execution returns an execution ID immediately while the function continues running in the background. This is better suited to work such as batch processing, email delivery, report generation, or upload post-processing. ```javascript const execution = await functions.createExecution({ functionId: '', - async: true, // returns immediately, runs in the background + async: true, }); ``` -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. +The SDK method is asynchronous in both cases. The `async` option controls whether Appwrite waits for the Function execution to complete before responding. -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. +# Choosing the right approach with Appwrite -# Getting started with Appwrite Functions +Use `await` when your application needs the result of an Appwrite SDK request before continuing. Run independent SDK requests concurrently when they can safely happen together. -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. +For Appwrite Functions, use synchronous execution when the caller needs the function result immediately. Use asynchronous execution when the work can continue in the background without blocking the request. -The fastest way to see it in practice is to deploy a function and try both execution modes yourself. +To explore these patterns further: * [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 +* [Join the Appwrite Discord community](https://appwrite.io/discord) From bbae08699185312130f17feb7f1a31bcb5b1798a Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Mon, 27 Jul 2026 13:52:56 +0530 Subject: [PATCH 13/25] latest anthropic release --- .optimize-cache.json | 1 + .../+page.markdoc | 132 ++++++++++++++++++ .../cover.avif | Bin 0 -> 6648 bytes 3 files changed, 133 insertions(+) create mode 100644 src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc create mode 100644 static/images/blog/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/cover.avif diff --git a/.optimize-cache.json b/.optimize-cache.json index 47a08a04bb..c9a5ea5850 100644 --- a/.optimize-cache.json +++ b/.optimize-cache.json @@ -488,6 +488,7 @@ "static/images/blog/claude-fable-5-returns-with-stronger-jailbreak-safeguards/cover.png": "bfe441fb7c04a21cb431119065ae05f2c1b044d9885cba7ef3651290f2ff3bb3", "static/images/blog/claude-mythos-preview/cover.png": "aea7b0c45c492939048fbf04a9b001b96c7bf727bcf7e5afc8274f84644dd35d", "static/images/blog/claude-mythos-release-date-what-we-know-so-far/cover.png": "0197caa87f00bc03063fb2b1872052cf02733298b2991871852762f32fcfa202", + "static/images/blog/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/cover.png": "e187298a4b254a1fcd3783ad17575cef43f8c77d59f1b8bd73ce4eb21f9380c7", "static/images/blog/claude-sonnet-5-is-anthropics-most-agentic-sonnet-yet/cover.png": "15a3350966c037f6747c4b3626e9770ba4ee8065439702903ee3cde13a4573e2", "static/images/blog/claude-vs-gpt-vs-gemini-for-developers-who-wins-in-2026/cover.png": "b931411d483646bcc79649dfc518e86fa4768504b13dbd3d03885c9a2bbde531", "static/images/blog/client-dashboards-internal-tools/cover.png": "d758f2f517487e24037cef5b3e9036ade6c238cd2f216ef6c76ce5467c665d92", diff --git a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc new file mode 100644 index 0000000000..bc1e62490f --- /dev/null +++ b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc @@ -0,0 +1,132 @@ +--- +layout: post +title: Claude Opus 5 nears Fable 5 intelligence at half the price +description: Claude Opus 5 lands with near Fable 5 intelligence at half the price, state-of-the-art agentic coding, and lighter cyber safeguards for agent builders. +date: 2026-07-27 +cover: /images/blog/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/cover.avif +timeToRead: 5 +author: aishwari +category: ai +featured: false +faqs: + - question: What is Claude Opus 5? + answer: "Claude Opus 5 is Anthropic's latest Opus-class model and the successor to Claude Opus 4.8. It is designed for everyday coding, knowledge work, computer use, and agentic tasks." + - question: How much does Claude Opus 5 cost? + answer: Claude Opus 5 costs $5 per million input tokens and $25 per million output tokens. This is the same price as Opus 4.8 and half the per-token price of Claude Fable 5. + - question: How does Claude Opus 5 compare to Claude Fable 5? + answer: Claude Opus 5 approaches Fable 5 performance across several coding and knowledge work benchmarks while costing half as much per token. Fable 5 remains better suited to some highly complex, cybersecurity, and biology workloads. + - question: Does Claude Opus 5 support Fast mode? + answer: Yes. Claude Opus 5 offers a Fast mode that runs around 2.5 times faster than the default mode and is priced at twice the base rate. +--- +Claude Opus 5 is now Anthropic's default everyday model, landing close to the frontier intelligence of Claude Fable 5 while costing half as much per token. Anthropic [announced Claude Opus 5](https://www.anthropic.com/news/claude-opus-5) on July 24, 2026, positioning it as a thoughtful, proactive model built to be used every day rather than reached for only on the hardest problems. You call it through the Claude API with the model id `claude-opus-5`. + +The headline is the price-to-intelligence ratio. On coding and knowledge work evaluations, Opus 5 is state-of-the-art, yet it is priced the same as its predecessor Opus 4.8 and half the per-token price of Fable 5. Here is what shipped, how it compares, and what it means if you build agents on Appwrite. + +# What is Claude Opus 5? + +Claude Opus 5 is Anthropic's newest Opus-class model and the successor to [Claude Opus 4.8](/blog/post/anthropic-just-launched-claude-opus-48-with-fast-mode-and-dynamic-workflows). Anthropic describes it as a model designed for daily use: proactive, thorough, and efficient enough to run across routine work without the cost tradeoffs that usually come with frontier-class quality. + +It is the new default model on Claude Max and the strongest model available on Claude Pro. On coding and knowledge work benchmarks like Frontier-Bench and GDPval-AA, Opus 5 is the new state-of-the-art, though it remains behind [Claude Mythos 5](/blog/post/anthropic-just-launched-claude-fable-5-and-claude-mythos-5) on cybersecurity tasks. It ships with the same effort control as recent Claude models, so you can dial reasoning up for intelligence or down to conserve tokens for faster, cheaper results. + +# Claude Opus 5 benchmarks: near Fable 5 intelligence, half the price + +Claude Opus 5 provides greatly improved performance at the same cost as Opus 4.8. Anthropic reports results across effort settings so you can see where the intelligence-versus-cost curve lands for your workload. + +* **Frontier-Bench v0.1.** Opus 5 surpasses every other model and more than doubles Opus 4.8's performance, at a lower cost per task. +* **CursorBench 3.2.** At max effort, Opus 5 performs within 0.5% of Fable 5's peak score, but at half the cost per task. It also delivers more performance per dollar than any other model at high, xhigh, and max effort. +* **ARC-AGI 3.** On this test of novel problem solving, Opus 5's score is three times as high as the next-best model. This is [the ARC Prize benchmark](https://arcprize.org/) designed to resist memorization. +* **Zapier AutomationBench.** Opus 5's pass rate is around 1.5 times the next-best model for the same cost per task. Even at its lowest effort setting, it passes more tasks than any other model. +* **OSWorld 2.0.** On [this computer use benchmark](https://os-world.github.io/), Opus 5 outperforms every other model at any given cost, surpassing Fable 5's best result at just over a third of the cost. + +Anthropic also calls Opus 5 its best and most cost-efficient model on several related evaluations, including GDPval-AA v2, Humanity's Last Exam, AutomationBench, and DeepSearchQA. The pattern is consistent: Opus 5 gets close to Fable 5 quality while spending far fewer tokens and dollars to get there. + +# How Claude Opus 5 compares to Claude Fable 5 + +The most useful way to think about Opus 5 is as the daily-driver counterpart to Fable 5. Fable 5 remains Anthropic's most capable generally available model, but it costs $10 per million input tokens and $50 per million output tokens. Opus 5 lands close on most coding and knowledge work benchmarks at half that price. + +The practical guidance: + +* Reach for **Opus 5** as your default for agentic coding, knowledge work, and computer use, where it is state-of-the-art and cheaper to run at scale. +* Reach for **Fable 5** when you need its edge on the longest, most complex tasks, or on cybersecurity and biology work where Opus 5's safeguards route requests elsewhere. +* Tune the **effort setting** rather than assuming a fixed cost. Higher effort spends more tokens, so match it to how hard the task actually is. + +This mirrors the tradeoff we covered for [Claude Sonnet 5](/blog/post/claude-sonnet-5-is-anthropics-most-agentic-sonnet-yet): per-token price is only one input to total task cost. Effort level and total tokens used matter just as much. + +# What Claude Opus 5 is good at + +The clearest improvement in Opus 5 is agency. It verifies its own work and iterates carefully until it succeeds, rather than declaring a task done at the first plausible answer. Anthropic and its early-access customers surfaced several concrete examples: + +* **Building its own tooling to finish a task.** On one Frontier-Bench task, Opus 5 was given a drawing of a machine part and asked to rebuild it as a 3D FreeCAD model, but with no way to directly view the drawing. It wrote its own computer vision pipeline to pull the geometry from raw pixels, then reconstructed the full part. It succeeded repeatedly, where no competing model with the same setup could solve it in five attempts. +* **Finding the root cause, not the symptom.** Given a real bug in a popular open-source package manager, Opus 5 found the root cause and fixed an edge case the community's own patch had missed. A competing model fixed only the surface symptom and reported the bug resolved. +* **Validating without a reference.** An engineer at a trading firm used Opus 5 to build a market data feed for a new exchange in a single session, a task previous models could not complete even with extensive plans. With no live feed to validate against, Opus 5 built its own test harness to confirm its code parsed the exchange's data correctly. + +For agent builders, this self-verifying behavior is the property that matters most. An agent that checks its own output catches errors before they compound across a long chain of steps. + +# Claude Opus 5 for scientific research + +Opus 5 is a meaningful step up from Opus 4.8 for science. It improves on every one of Anthropic's life sciences evaluations, which span structural biology, organic chemistry, and bioinformatics. + +The gains are largest in chemistry and protein work. On Anthropic's internal benchmark, Opus 5 scores 10.2 percentage points higher than Opus 4.8 at inferring molecular structures from spectroscopy data, and 7.7 percentage points higher at predicting how variations in a protein's sequence affect its function. Because its safeguards are similar to Opus 4.8, Anthropic now considers Opus 5 its most capable generally available model for scientific research. + +# Claude Opus 5 alignment and safety + +Anthropic reports that Opus 5 is its most aligned model to date. On its automated behavioral audit, Opus 5 scored 2.3 on overall misaligned behavior, the lowest of any recent Claude model, and lower than Opus 4.8, Sonnet 5, and Fable 5. + +* It adheres to Claude's Constitution better than those models. +* It shows the lowest rates of deceptive behavior. +* It is the least susceptible to being tricked into misuse. +* It is Anthropic's safest model yet at avoiding reckless actions with hard-to-reverse side effects. + +On dual-use safety, Opus 5 does not advance the frontier. Anthropic deliberately avoided training it on cyber tasks, and in evaluations run with private-sector and government partners it remains behind Mythos 5 in both biology research and offensive cybersecurity. Opus 5 comes close to Mythos 5 at finding cybersecurity vulnerabilities, but stays substantially behind at turning those vulnerabilities into working exploits. On Anthropic's OSS-Fuzz evaluation, the two models identify vulnerabilities with similar success, yet Opus 5's exploit-development score is far below Mythos 5's. Full detail is in the [Claude Opus 5 System Card](https://www.anthropic.com/news/claude-opus-5). + +# Claude Opus 5 safeguards and cyber fallbacks + +Opus 5's safeguards are close to those on Opus 4.8, with stronger guardrails on a narrow range of cyber tasks. This is the part of the launch that changes how you design agents that touch security-adjacent work. + +* The cyber classifiers are proportionally **less restrictive than Fable 5's**. They allow Opus 5 to find vulnerabilities in source code, but block binary-based vulnerability scanning, penetration testing, and exploit generation. +* Anthropic expects these classifiers to intervene around **85% less often** than they do on Fable 5. +* In Claude.ai, Claude Code, and Claude Cowork, any flagged request **falls back to Opus 4.8** by default. Fallbacks can also be enabled on the API. +* Anthropic's **Cyber Verification Program** gives approved enterprises and researchers access to a version of Opus 5 with fewer restrictions. + +On biology, because Opus 5 carries a similar suite of safeguards to Opus 4.8, biology-related requests that are blocked on Fable 5 now route to Opus 5 rather than Opus 4.8. The model still has real limits on long-running autonomous research, where Mythos 5 remains stronger. + +# How much does Claude Opus 5 cost? + +Claude Opus 5 is priced at **$5 per million input tokens and $25 per million output tokens**, the same as Opus 4.8 and half the per-token price of Fable 5. + +| Model | Input (per 1M tokens) | Output (per 1M tokens) | +| --------------- | --------------------- | ---------------------- | +| Claude Opus 5 | $5 | $25 | +| Claude Opus 4.8 | $5 | $25 | +| Claude Fable 5 | $10 | $50 | + +Opus 5 is also offered in Fast mode, where it runs around 2.5 times the default speed. As with Opus 4.8, Fast mode is priced at twice the base rate on the Claude Platform and through usage credits in Claude Code. Consistent with prior Opus models, Opus 5 has no data retention requirements for general access. + +# What else shipped with Claude Opus 5 + +Alongside the model, Anthropic released two updates in beta that matter for anyone writing their own agent harness: + +* **Mid-conversation tool changes on the Claude Platform.** You can now change which tools Claude can use partway through a conversation without invalidating the prompt cache. That keeps cache hits intact on earlier turns as an agent's available tools evolve. +* **Automatic fallbacks on the API.** Requests flagged by the safety classifiers on Opus 5 or Fable 5 can automatically route to another model instead of being blocked, so API requests always resolve to the best available model by default. + +For tuning your prompts to the new model, Anthropic published a [prompting guide for Opus 5](https://www.anthropic.com/news/claude-opus-5). + +# What Claude Opus 5 means if you build on Appwrite + +Opus 5's strengths are long-horizon, self-verifying agentic work at a price that makes running it at scale realistic: agents that plan, drive tools, check their own output, and keep going across many steps. An agent doing that work needs somewhere to authenticate users, store state, persist files between steps, and run server-side logic. In other words, it needs a backend, and wiring one up by hand is usually the slow part of shipping an agentic app. + +If you want your Opus 5 powered agent to stand up that backend without manually assembling infrastructure, the [Appwrite plugin for Claude Code](/blog/post/announcing-appwrite-claude-code-plugin) bundles the Appwrite API MCP server, the Appwrite Docs MCP server, and SDK-specific agent skills into a single install. With the right project access and permissions, an agent can work directly with Appwrite APIs and docs to set up [Auth](/docs/products/auth), [Databases](/docs/products/databases), [Storage](/docs/products/storage), [Functions](/docs/products/functions), and [Sites](/docs/products/sites). See the [Claude Code integration guide](/docs/tooling/ai/ai-dev-tools/claude-code) and the [Appwrite MCP server docs](/docs/tooling/ai/mcp-servers) to get started. + +Because Opus 5 lets you tune effort against cost, it pairs well with high-volume agent workloads: run at lower effort for routine steps, and dial up only when a task genuinely needs deeper reasoning. + +# Build agentic apps on Appwrite + +Spin up the backend your next app needs in minutes. Start for free on Appwrite Cloud, connect the Claude API with the model id `claude-opus-5`, and let Appwrite handle Auth, Databases, Storage, Functions, Messaging, and Sites. Your Opus 5 agent builds the app, Appwrite runs the backend behind it, and you ship the product instead of wiring up infrastructure. + +# Resources + +* [Appwrite MCP server docs](/docs/tooling/ai/mcp-servers) +* [Start building on Appwrite Cloud](https://cloud.appwrite.io/) +* [Appwrite AI products](/docs/products/) +* [Appwrite integrations](/integrations) +* [Join the Appwrite Discord](https://appwrite.io/discord) \ No newline at end of file diff --git a/static/images/blog/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/cover.avif b/static/images/blog/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/cover.avif new file mode 100644 index 0000000000000000000000000000000000000000..6c59716fc588e16003f0288881cb70f8753cd9dc GIT binary patch literal 6648 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 Date: Mon, 27 Jul 2026 14:30:27 +0530 Subject: [PATCH 14/25] 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 78bff0d986..9cb2f7dd06 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 @@ -30,7 +30,7 @@ This guide covers what MCP is, how its architecture and primitives work, the tra 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). +MCP was developed by Anthropic and released as an open standard in November 2024. In December 2025, Anthropic donated MCP to the [Agentic AI Foundation](https://aaif.io/), a directed fund under the Linux Foundation, to support vendor-neutral governance. The specification and project development continue 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. From 26ecb5006516baba18f05f1a26dd929f05ea63fe Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Mon, 27 Jul 2026 14:46:45 +0530 Subject: [PATCH 15/25] Update +page.markdoc --- .../+page.markdoc | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) 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 9cb2f7dd06..66185b3dc0 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 @@ -94,16 +94,18 @@ MCP is already in production across everyday developer workflows, not just demos 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 +# How to build an MCP server -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. +You do not need to implement the protocol by hand. The MCP project provides official [SDKs](https://modelcontextprotocol.io/docs/sdk) that handle the JSON-RPC layer, initialization handshake, and transport for you. -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. +Building an MCP server generally involves four steps: -Two good ways to get hands-on: +1. **Define its capabilities.** Decide which tools, resources, or prompts the server should expose. +2. **Connect those capabilities to real logic.** A tool might call an API, query a database, or trigger an action, while a resource might return documentation or stored data. +3. **Choose a transport.** Use stdio when the server runs locally or Streamable HTTP when it is hosted remotely. +4. **Connect and test the server.** Add it to an MCP-compatible client and confirm that its capabilities can be discovered and invoked correctly. -* **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. +Start with a small, narrowly scoped server. Once the basic connection works, you can add more capabilities without changing how compatible clients communicate with it. # MCP security best practices @@ -111,17 +113,19 @@ MCP itself is just the protocol; security depends entirely on how a server is co 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 +# Getting started with Appwrite MCP servers -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. +Appwrite provides multiple MCP servers for different workflows. -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. +The [Appwrite API MCP server](/docs/tooling/ai/mcp-servers/api) connects AI coding agents to your Appwrite project, allowing them to work with services such as Auth, Databases, Storage, and Functions. Its compact two-tool architecture automatically supports Appwrite services while using less model context. + +The [Appwrite Docs MCP server](/docs/tooling/ai/mcp-servers/docs) gives compatible AI clients access to Appwrite documentation, helping them answer product questions and generate code using relevant Appwrite context. + +Read [how we rebuilt the API MCP server in MCP Server 2.0](/blog/post/announcing-appwrite-mcp-server-2), then follow the documentation to connect the server that fits your workflow. # 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 +* [Join the Appwrite Discord community](https://appwrite.io/discord) From 7ddab4784442e858429e87dc1688db7dbb326a1d Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Mon, 27 Jul 2026 09:30:59 +0000 Subject: [PATCH 16/25] Apply suggestion from @aishwaripahwa12 --- .../+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc index bc1e62490f..d93c6287f2 100644 --- a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc +++ b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc @@ -109,7 +109,7 @@ Alongside the model, Anthropic released two updates in beta that matter for anyo * **Mid-conversation tool changes on the Claude Platform.** You can now change which tools Claude can use partway through a conversation without invalidating the prompt cache. That keeps cache hits intact on earlier turns as an agent's available tools evolve. * **Automatic fallbacks on the API.** Requests flagged by the safety classifiers on Opus 5 or Fable 5 can automatically route to another model instead of being blocked, so API requests always resolve to the best available model by default. -For tuning your prompts to the new model, Anthropic published a [prompting guide for Opus 5](https://www.anthropic.com/news/claude-opus-5). +For tuning your prompts to the new model, Anthropic published a [prompting guide for Opus 5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5). # What Claude Opus 5 means if you build on Appwrite From 22d32f9d95cb21be6ad6525f9ed50779a9450e47 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Mon, 27 Jul 2026 15:01:06 +0530 Subject: [PATCH 17/25] Apply suggestion from @aishwaripahwa12 --- .../+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc index d93c6287f2..ded7aac2dd 100644 --- a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc +++ b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc @@ -1,7 +1,7 @@ --- layout: post title: Claude Opus 5 nears Fable 5 intelligence at half the price -description: Claude Opus 5 lands with near Fable 5 intelligence at half the price, state-of-the-art agentic coding, and lighter cyber safeguards for agent builders. +description: Claude Opus 5 lands with near Fable 5 intelligence at half the price, state-of-the-art agentic coding, and less restrictive cyber classifiers. date: 2026-07-27 cover: /images/blog/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/cover.avif timeToRead: 5 From f434736c210eab0bbcfb10563499f229203b67ac Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Mon, 27 Jul 2026 15:01:14 +0530 Subject: [PATCH 18/25] Apply suggestion from @aishwaripahwa12 --- .../+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc index ded7aac2dd..360d5832fa 100644 --- a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc +++ b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc @@ -18,7 +18,7 @@ faqs: - question: Does Claude Opus 5 support Fast mode? answer: Yes. Claude Opus 5 offers a Fast mode that runs around 2.5 times faster than the default mode and is priced at twice the base rate. --- -Claude Opus 5 is now Anthropic's default everyday model, landing close to the frontier intelligence of Claude Fable 5 while costing half as much per token. Anthropic [announced Claude Opus 5](https://www.anthropic.com/news/claude-opus-5) on July 24, 2026, positioning it as a thoughtful, proactive model built to be used every day rather than reached for only on the hardest problems. You call it through the Claude API with the model id `claude-opus-5`. +Claude Opus 5 is Anthropic's new model for everyday work, landing close to the frontier intelligence of Claude Fable 5 while costing half as much per token. Anthropic [announced Claude Opus 5](https://www.anthropic.com/news/claude-opus-5) on July 24, 2026, positioning it as a thoughtful, proactive model built to be used every day rather than reached for only on the hardest problems. You call it through the Claude API with the model id `claude-opus-5`. The headline is the price-to-intelligence ratio. On coding and knowledge work evaluations, Opus 5 is state-of-the-art, yet it is priced the same as its predecessor Opus 4.8 and half the per-token price of Fable 5. Here is what shipped, how it compares, and what it means if you build agents on Appwrite. From e05d92566f68c11d447ea81a77f533613c118856 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Mon, 27 Jul 2026 15:01:22 +0530 Subject: [PATCH 19/25] Apply suggestion from @aishwaripahwa12 --- .../+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc index 360d5832fa..a87e90008f 100644 --- a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc +++ b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc @@ -47,7 +47,7 @@ The most useful way to think about Opus 5 is as the daily-driver counterpart to The practical guidance: * Reach for **Opus 5** as your default for agentic coding, knowledge work, and computer use, where it is state-of-the-art and cheaper to run at scale. -* Reach for **Fable 5** when you need its edge on the longest, most complex tasks, or on cybersecurity and biology work where Opus 5's safeguards route requests elsewhere. +* Reach for **Fable 5** when you need its edge on the longest and most complex tasks. For offensive cybersecurity and long-running autonomous biology research, Anthropic says Mythos 5 remains stronger. * Tune the **effort setting** rather than assuming a fixed cost. Higher effort spends more tokens, so match it to how hard the task actually is. This mirrors the tradeoff we covered for [Claude Sonnet 5](/blog/post/claude-sonnet-5-is-anthropics-most-agentic-sonnet-yet): per-token price is only one input to total task cost. Effort level and total tokens used matter just as much. From 2bbc3e9d45f20cf148a544632e91982657a184b9 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Mon, 27 Jul 2026 15:01:30 +0530 Subject: [PATCH 20/25] Apply suggestion from @aishwaripahwa12 --- .../+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc index a87e90008f..d7467c2802 100644 --- a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc +++ b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc @@ -77,7 +77,7 @@ Anthropic reports that Opus 5 is its most aligned model to date. On its automate * It is the least susceptible to being tricked into misuse. * It is Anthropic's safest model yet at avoiding reckless actions with hard-to-reverse side effects. -On dual-use safety, Opus 5 does not advance the frontier. Anthropic deliberately avoided training it on cyber tasks, and in evaluations run with private-sector and government partners it remains behind Mythos 5 in both biology research and offensive cybersecurity. Opus 5 comes close to Mythos 5 at finding cybersecurity vulnerabilities, but stays substantially behind at turning those vulnerabilities into working exploits. On Anthropic's OSS-Fuzz evaluation, the two models identify vulnerabilities with similar success, yet Opus 5's exploit-development score is far below Mythos 5's. Full detail is in the [Claude Opus 5 System Card](https://www.anthropic.com/news/claude-opus-5). +On dual-use safety, Opus 5 does not advance the frontier. Anthropic deliberately avoided training it on cyber tasks, and in evaluations run with private-sector and government partners it remains behind Mythos 5 in both biology research and offensive cybersecurity. Opus 5 comes close to Mythos 5 at finding cybersecurity vulnerabilities, but stays substantially behind at turning those vulnerabilities into working exploits. On Anthropic's OSS-Fuzz evaluation, the two models identify vulnerabilities with similar success, yet Opus 5's exploit-development score is far below Mythos 5's. Full detail is in the [Claude Opus 5 System Card](https://www-cdn.anthropic.com/c5fbac3f0b1280a933ebd26d3cb8bb9f5bdeaf48/Claude%20Opus%205%20System%20Card.pdf). # Claude Opus 5 safeguards and cyber fallbacks From 101cd9b8c17b4af62a7b3f94877c5f747726d862 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Mon, 27 Jul 2026 15:02:08 +0530 Subject: [PATCH 21/25] Apply suggestion from @aishwaripahwa12 --- .../+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc index d7467c2802..4196cf43fd 100644 --- a/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc +++ b/src/routes/blog/post/claude-opus-5-nears-fable-5-intelligence-at-half-the-price/+page.markdoc @@ -107,7 +107,7 @@ Opus 5 is also offered in Fast mode, where it runs around 2.5 times the default Alongside the model, Anthropic released two updates in beta that matter for anyone writing their own agent harness: * **Mid-conversation tool changes on the Claude Platform.** You can now change which tools Claude can use partway through a conversation without invalidating the prompt cache. That keeps cache hits intact on earlier turns as an agent's available tools evolve. -* **Automatic fallbacks on the API.** Requests flagged by the safety classifiers on Opus 5 or Fable 5 can automatically route to another model instead of being blocked, so API requests always resolve to the best available model by default. +* **Automatic fallbacks on the API.** Users can choose to have requests flagged by the safety classifiers on Opus 5 or Fable 5 automatically route to another model. With automatic fallbacks enabled, API requests route to the best available model instead of being blocked. For tuning your prompts to the new model, Anthropic published a [prompting guide for Opus 5](https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/prompting-claude-opus-5). From cd44f65cff97dd7221c526ea20ae7f57c0707a4e Mon Sep 17 00:00:00 2001 From: Aditya Oberai Date: Tue, 28 Jul 2026 01:49:26 +0530 Subject: [PATCH 22/25] Fix code example in blog --- .../asynchronous-vs-synchronous-programming/+page.markdoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc b/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc index 6ed2a0f243..ee3804def2 100644 --- a/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc +++ b/src/routes/blog/post/asynchronous-vs-synchronous-programming/+page.markdoc @@ -144,11 +144,11 @@ This gives developers readable, sequential-looking code without blocking the app When multiple Appwrite requests do not depend on one another, you can run them concurrently with `Promise.all()` instead of waiting for each one separately. ```javascript -const [user, documents] = await Promise.all([ +const [user, rows] = await Promise.all([ account.get(), - databases.listDocuments({ + tablesDB.listRows({ databaseId: '', - collectionId: '', + tableId: '', }), ]); ``` From 001d133e65059ed76fe1cb7bc0f4b28189b6c180 Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Tue, 28 Jul 2026 16:47:28 +0530 Subject: [PATCH 23/25] Credit community suggestion in MCP Server 2.0 blog --- .../blog/post/announcing-appwrite-mcp-server-2/+page.markdoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/routes/blog/post/announcing-appwrite-mcp-server-2/+page.markdoc b/src/routes/blog/post/announcing-appwrite-mcp-server-2/+page.markdoc index 43237078e9..6d884ffb3e 100644 --- a/src/routes/blog/post/announcing-appwrite-mcp-server-2/+page.markdoc +++ b/src/routes/blog/post/announcing-appwrite-mcp-server-2/+page.markdoc @@ -70,6 +70,8 @@ The full catalog of Appwrite operations stays internal to the server. When the m If you are already using the Appwrite MCP server, remove all service flags from the list of arguments from your existing configuration. Using `uvx` automatically fetches the latest version. +A special thanks to [Abid Abdulgafoor](https://www.linkedin.com/in/abidabdulgafoor/) from our community, who suggested the two-tool architecture that shaped this release. + # Resources - [MCP server documentation](/docs/tooling/ai/mcp-servers/api) From 12f7b360abd109e040998f6ab075f2d29e8bb868 Mon Sep 17 00:00:00 2001 From: Aishwari Pahwa Date: Tue, 28 Jul 2026 16:58:10 +0530 Subject: [PATCH 24/25] updated the image --- .optimize-cache.json | 1 + .../post/free-hosting-platform/+page.markdoc | 57 ++++++++---------- .../blog/free-hosting-platform/cover.avif | Bin 0 -> 19684 bytes 3 files changed, 27 insertions(+), 31 deletions(-) create mode 100644 static/images/blog/free-hosting-platform/cover.avif diff --git a/.optimize-cache.json b/.optimize-cache.json index a8638f1cdb..b68b74a2a4 100644 --- a/.optimize-cache.json +++ b/.optimize-cache.json @@ -653,6 +653,7 @@ "static/images/blog/free-astro-hosting/cover.png": "588e67ef5cb8901ff2036bc0617d40ff6e4372004741c82ed4b068616404c457", "static/images/blog/free-flutter-web-hosting/cover.png": "c70a94ed29e99afb07b5263dc0f1acabd84b92e1527dcc8a22153cf91cd31479", "static/images/blog/free-hosting-2025.png": "1111d3b1b9734458af63fb35204c393d18b5d299c31321a3a563bcb1d1011144", + "static/images/blog/free-hosting-platform/cover.png": "424db3dc095b579928e97235d534cc50e9fb597cb374656e4e6b9114a717af21", "static/images/blog/free-nextjs-hosting/cover.png": "ad0c18cae7bee745bd7dc0bd62b73c62629cf49551e2c7f38dacbce53a9960e7", "static/images/blog/free-nuxt-hosting/cover.png": "e162e6f93dacf7d81cace9de016b0cacba31efa843231af3d6d57d62130a8d63", "static/images/blog/free-react-hosting/cover.png": "9d3eeac6e93c5f81b2f05ffec3315898174d203fdc6c168353e9e3157c8f07a9", diff --git a/src/routes/blog/post/free-hosting-platform/+page.markdoc b/src/routes/blog/post/free-hosting-platform/+page.markdoc index 1489c7068c..616376ed77 100644 --- a/src/routes/blog/post/free-hosting-platform/+page.markdoc +++ b/src/routes/blog/post/free-hosting-platform/+page.markdoc @@ -1,10 +1,10 @@ --- layout: post -title: "Best free hosting platforms in 2026" -description: "These are the best free hosting platforms for developers to deploy their frontend in 2026." +title: Best free hosting platforms in 2026 +description: These are the best free hosting platforms for developers to deploy their frontend in 2026. date: 2025-09-04 lastUpdated: 2026-05-22 -cover: /images/blog/free-hosting-2025.avif +cover: /images/blog/free-hosting-platform/cover.avif timeToRead: 6 author: laura-du-ry category: tutorial @@ -12,27 +12,26 @@ featured: false callToAction: true unlisted: true faqs: - - question: "What is the best free hosting platform in 2026?" - answer: "Appwrite, Vercel, and Netlify are the top contenders. Appwrite stands out for full-stack projects, while Vercel and Netlify dominate frontend hosting." - - question: "Can I host both frontend and backend for free?" - answer: "Yes. Platforms like Appwrite, Firebase, and Railway allow you to host both frontend apps and backend services for free tiers." - - question: "Which hosting is best for Next.js or React projects?" - answer: "Vercel is the best fit for Next.js, while Netlify and Appwrite also support React and other frontend frameworks." - - question: "Is free hosting reliable for production apps?" + - question: What is the best free hosting platform in 2026? + answer: Appwrite, Vercel, and Netlify are the top contenders. Appwrite stands out for full-stack projects, while Vercel and Netlify dominate frontend hosting. + - question: Can I host both frontend and backend for free? + answer: Yes. Platforms like Appwrite, Firebase, and Railway allow you to host both frontend apps and backend services for free tiers. + - question: Which hosting is best for Next.js or React projects? + answer: Vercel is the best fit for Next.js, while Netlify and Appwrite also support React and other frontend frameworks. + - question: Is free hosting reliable for production apps? answer: "Free hosting is excellent for MVPs, testing, and early-stage startups. For production workloads, it's best to upgrade to a paid plan for better reliability, SLAs, and scaling." - - question: "How does Appwrite compare to Firebase, Netlify, and Vercel?" + - question: How does Appwrite compare to Firebase, Netlify, and Vercel? answer: "Firebase is tightly coupled with Google's ecosystem. Netlify is great for Jamstack. Vercel is ideal for Next.js. Appwrite combines web hosting plus backend services, giving developers more flexibility." --- - Web hosting has come a long way since the early days of shared servers and static sites. Today, developers expect more than just a place to put their files, they want speed, scalability, modern deployment workflows, and flexibility to grow from a free project into a full-scale production app. For **startups, agencies, and independent developers**, free hosting has become the gateway to innovation. It allows teams to test, build MVPs, and deploy client projects with little upfront cost. But not all free hosting platforms are created equal. -In this guide, we’ll break down the **best free hosting, best web hosting, best frontend hosting, and best frontend deployment platforms in 2026**. We’ll compare providers like **Appwrite, Vercel, Netlify, Firebase, Render, and Railway**, and explain how to choose the right one for your needs. +In this guide, we'll break down the **best free hosting, best web hosting, best frontend hosting, and best frontend deployment platforms in 2026**. We'll compare providers like **Appwrite, Vercel, Netlify, Firebase, Render, and Railway**, and explain how to choose the right one for your needs. # What makes a hosting platform the best? -When evaluating hosting platforms, technical leaders such as CTOs and co-founders often weigh more than just price. Here’s what sets the best apart: +When evaluating hosting platforms, technical leaders such as CTOs and co-founders often weigh more than just price. Here's what sets the best apart: ## Performance & scalability @@ -42,7 +41,7 @@ When evaluating hosting platforms, technical leaders such as CTOs and co-founder ## Ease of deployment -* Git-based workflows: push your code, and it’s live. +* Git-based workflows: push your code, and it's live. * CI/CD pipelines for continuous delivery. * One-click deployment integrations. @@ -69,17 +68,17 @@ Here are the top players offering free hosting solutions: ## 1. Appwrite Sites -Appwrite is an **all-in-one development platform with web hosting and backend deployment**. Unlike competitors, it doesn’t just provide hosting; it provides a full developer stack, including authentication, databases, realtime, [serverless functions](/products/functions), [messaging](/products/messaging), and more. +Appwrite is an **all-in-one development platform with web hosting and backend deployment**. Unlike competitors, it doesn't just provide hosting; it provides a full developer stack, including authentication, databases, realtime, [serverless functions](/products/functions), [messaging](/products/messaging), and more. * **Best for:** Full-stack apps, SaaS MVPs, teams who want backend + web hosting on one platform. * **Strengths:** Integrated backend services, scalability, strong open-source ecosystem. * **Free tier:** Generous limits with databases, APIs, storage, and hosting included. -{% call_to_action title="Build your startup with Appwrite" description="An all-in-one development platform for you to develop, host, and scale your products." point1="Cloud credits" point2="Priority support" point3="Ship faster" point4="Built-in security and compliance" cta="Apply for the program" url="https://appwrite.io/startups" /%} +{% call\_to\_action title\="Build your startup with Appwrite" description\="An all-in-one development platform for you to develop, host, and scale your products." point1\="Cloud credits" point2\="Priority support" point3\="Ship faster" point4\="Built-in security and compliance" cta\="Apply for the program" url\="https://appwrite.io/startups" /%} ## 2. Vercel -Vercel is the go-to platform for **Next.js** projects but supports other frameworks as well. It’s optimized for frontend-first workflows with global edge delivery. +Vercel is the go-to platform for **Next.js** projects but supports other frameworks as well. It's optimized for frontend-first workflows with global edge delivery. * **Best for:** React/Next.js developers. * **Strengths:** Lightning-fast deployments, edge functions, great for frontend-heavy teams. @@ -105,17 +104,17 @@ Firebase offers **hosting for SPAs and PWAs** with easy integration into the Goo Render supports both **frontend and backend hosting**. -* **Best for:** Developers needing both static hosting and backend APIs. -* **Strengths:** Deploy web services, databases, and static sites with one provider. +* **Best for:** Developers needing both static hosting and backend APIs. +* **Strengths:** Deploy web services, databases, and static sites with one provider. * **Free tier:** Free static sites and free instance types; 750 free instance hours per workspace/month. Included outbound bandwidth: 100 GB/month in the Hobby workspace (overage billed or services suspended without a payment method). ## 6. Railway Railway supports full-stack apps with a usage-based model. -* **Best for:** Developers needing managed deploys for web services and databases. -* **Strengths:** Usage-based compute with automatic sleep on idle; serverless-like ergonomics. -* **Plan notes:** No always-free runtime tier. Hobby/Pro are usage-based; trials may be available. Check current pricing before positioning it as “free.” +* **Best for:** Developers needing managed deploys for web services and databases. +* **Strengths:** Usage-based compute with automatic sleep on idle; serverless-like ergonomics. +* **Plan notes:** No always-free runtime tier. Hobby/Pro are usage-based; trials may be available. Check current pricing before positioning it as "free." # Best web hosting platforms beyond free tiers @@ -144,7 +143,7 @@ Not every project can run forever on free hosting. For startups moving into prod # Best frontend hosting options -Frontend hosting is a different category than full-stack hosting. It’s focused on static sites, SPAs, and server-rendered apps. +Frontend hosting is a different category than full-stack hosting. It's focused on static sites, SPAs, and server-rendered apps. ## React, Vue, and Angular apps @@ -163,7 +162,7 @@ Frontend hosting is a different category than full-stack hosting. It’s focused # Best frontend deployment workflows -Modern deployment is more than FTP uploads, it’s automated, scalable, and tightly integrated with developer workflows. +Modern deployment is more than FTP uploads, it's automated, scalable, and tightly integrated with developer workflows. ## GitHub/GitLab/Bitbucket integration @@ -184,7 +183,7 @@ Modern deployment is more than FTP uploads, it’s automated, scalable, and tigh # Free hosting with added features you should consider -When comparing free hosting platforms, look beyond just “is it free.” Critical features include: +When comparing free hosting platforms, look beyond just "is it free." Critical features include: * **SSL Certificates**: Built-in HTTPS for security. * **Custom Domains**: Branding for professional apps. @@ -202,7 +201,6 @@ When comparing free hosting platforms, look beyond just “is it free.” Critic | **Firebase** | 1 GB storage, 10 GB transfer | SPAs/PWAs | Yes | Yes | Blaze plan | | **Render/Railway** | Free static + backend hosting | Backend + frontend | Yes | Yes | Usage-based tiers | - # How to pick the right hosting for your team ## For startups @@ -220,7 +218,6 @@ When comparing free hosting platforms, look beyond just “is it free.” Critic * Focus on compliance, SLAs, and reliability. * Likely to use AWS, GCP, or Azure, but Appwrite offers on-prem or cloud flexibility. - # Conclusion & recommendations In 2026, the **best free hosting platforms** combine performance, scalability, and developer experience. @@ -231,6 +228,4 @@ In 2026, the **best free hosting platforms** combine performance, scalability, a * **Firebase**: Best for mobile-first teams in the Google ecosystem. * **Render/Railway**: Best for balanced frontend + backend deployment. -If you’re building a SaaS MVP, managing multiple client projects, or running a growing startup, **Appwrite provides the best mix of free hosting + frontend deployment + backend APIs**, all without lock-in. - - +If you're building a SaaS MVP, managing multiple client projects, or running a growing startup, **Appwrite provides the best mix of free hosting + frontend deployment + backend APIs**, all without lock-in. \ No newline at end of file diff --git a/static/images/blog/free-hosting-platform/cover.avif b/static/images/blog/free-hosting-platform/cover.avif new file mode 100644 index 0000000000000000000000000000000000000000..b9be006aa5ee8528deada2a18d1a4e19b49bc085 GIT binary patch literal 19684 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 literal 0 HcmV?d00001 From c79122d433c067f2c47cb21e82afd025be21b4b2 Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Tue, 28 Jul 2026 17:04:13 +0530 Subject: [PATCH 25/25] Apply suggestion from @atharvadeosthale --- src/routes/blog/post/free-hosting-platform/+page.markdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/blog/post/free-hosting-platform/+page.markdoc b/src/routes/blog/post/free-hosting-platform/+page.markdoc index 616376ed77..4c402a5637 100644 --- a/src/routes/blog/post/free-hosting-platform/+page.markdoc +++ b/src/routes/blog/post/free-hosting-platform/+page.markdoc @@ -74,7 +74,7 @@ Appwrite is an **all-in-one development platform with web hosting and backend de * **Strengths:** Integrated backend services, scalability, strong open-source ecosystem. * **Free tier:** Generous limits with databases, APIs, storage, and hosting included. -{% call\_to\_action title\="Build your startup with Appwrite" description\="An all-in-one development platform for you to develop, host, and scale your products." point1\="Cloud credits" point2\="Priority support" point3\="Ship faster" point4\="Built-in security and compliance" cta\="Apply for the program" url\="https://appwrite.io/startups" /%} +{% call_to_action title="Build your startup with Appwrite" description="An all-in-one development platform for you to develop, host, and scale your products." point1="Cloud credits" point2="Priority support" point3="Ship faster" point4="Built-in security and compliance" cta="Apply for the program" url="https://appwrite.io/startups" /%} ## 2. Vercel