Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/frappe/frappe/llms.txt

Use this file to discover all available pages before exploring further.

Frappe Framework

Build powerful web applications faster

Frappe Framework is a full-stack, metadata-driven web framework that uses Python and MariaDB on the server side with a tightly integrated JavaScript client library. Built to power ERPNext, it’s designed for building complex, database-driven applications with minimal code.
Philosophy: The best code is the one that is not written. Frappe achieves this through metadata-driven development, where you define what your data looks like, and the framework handles the rest.

Why Frappe?

Started in 2005, Frappe was inspired by the Semantic Web concept—a framework that describes not just how information appears, but what it means. This semantic approach makes building complex applications easier, more consistent, and infinitely extensible.

Full-stack framework

Covers both front-end and back-end development in a single, cohesive framework

Built-in admin interface

Pre-built, customizable admin dashboard for managing application data

Role-based permissions

Comprehensive user and role management system built-in

REST API

Automatically generated RESTful API for all models

Report builder

Powerful reporting tool for creating custom reports without code

Background jobs

Built-in job queue powered by Redis and RQ for async tasks

Get started

Installation

Set up Frappe Framework with Docker or manual installation

Quick start

Build your first “Hello World” app in minutes

Architecture

Understand the core concepts and structure

Core concepts

Learn about DocTypes, Documents, and more

Key features at a glance

Metadata-driven development

Define your data structure using DocTypes—Frappe’s metadata model. The framework automatically generates forms, list views, APIs, and database schemas.
# No manual form creation needed!
doc = frappe.get_doc({
    "doctype": "ToDo",
    "description": "Complete documentation",
    "priority": "High"
})
doc.insert()

Powerful ORM and query builder

Work with your database using Frappe’s intuitive ORM or PyPika-powered query builder:
# Simple ORM
todos = frappe.get_all(
    "ToDo",
    filters={"status": "Open"},
    fields=["name", "description", "priority"]
)

# Query builder for complex queries
ToDo = frappe.qb.DocType("ToDo")
query = (
    frappe.qb.from_(ToDo)
    .select(ToDo.name, ToDo.description)
    .where(ToDo.status == "Open")
    .orderby(ToDo.priority)
)
results = query.run(as_dict=True)

Real-time updates

Built-in WebSocket support for real-time features:
import frappe

@frappe.whitelist()
def update_progress():
    for i in range(100):
        frappe.publish_progress(
            percent=i,
            title="Processing...",
            description=f"Step {i} of 100"
        )

Who uses Frappe?

Frappe powers thousands of applications worldwide, including:
  • ERPNext - Open source ERP with 700+ object types
  • Healthcare - Hospital management system
  • Education - School and learning management
  • Custom business applications across industries

See Frappe in action

Learn from Frappe School’s comprehensive courses and tutorials

Community and support

Frappe School

Free courses on Frappe Framework and ERPNext

Discussion Forum

Engage with the community

GitHub

Contribute to the framework

Production ready

Frappe Cloud

Managed hosting with automatic updates and monitoring

Self-hosting

Deploy on your own infrastructure
Ready to build? Start with our quick start guide to create your first Frappe app in under 10 minutes.