app-development

Scaffold and architect custom Frappe apps with hooks, services, and background jobs.

62|23|Updated Feb 7, 2026
One-click install
npx skills add https://github.com/lubusIN/frappe-skills --skill app-development-lubusin
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: app-development
Source: https://github.com/lubusIN/frappe-skills/tree/main/app-development
Command: npx skills add https://github.com/lubusIN/frappe-skills --skill app-development-lubusin

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill requires requests, and includes references (resource) and assets (resource) components.

What problem does it solve? Building a custom Frappe app involves many moving parts—app scaffolding, hooks.py configuration, service layers, background jobs, caching, logging, and translations—and mistakes in any of these cause silent failures like hooks not firing or jobs never running. This Skill provides a structured, production-oriented procedure for creating and hardening Frappe apps correctly from the start. ## Core Features & Use Cases - App Scaffolding & Structure: Create apps with bench new-app and organize code using a domain architecture with thin DocType controllers, service modules, integrations, and utilities. - Hooks & Background Jobs: Configure hooks.py for doc_events, scheduler_events, and overrides, and enqueue long-running tasks with frappe.enqueue. - Cross-Cutting Utilities & Templates: Use the included mini-app-template with ready-made helpers for caching, error envelopes, logging, permissions, and validation, plus sample DocTypes, workflows, reports, and dashboards. - Use Case: You need to build a billing app that reacts to Sales Order submissions, syncs external data every six hours, and exposes a clean RPC API—this Skill walks you through scaffolding, hook wiring, service-layer design, and production hardening checklists. ## Quick Start Ask the assistant to scaffold a new Frappe app with a service layer, scheduled background job, and hooks configuration for your target Frappe version.

Frequently Asked Questions about app-development

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I create a new custom Frappe app?▼

Run `bench new-app my_app` to scaffold the app, then install it with `bench --site <site> install-app my_app`. Ensure developer mode is enabled so DocType changes export to files, and organize business logic in service modules rather than DocType controllers.

How do I configure hooks.py in a Frappe app?▼

Define doc_events for document lifecycle callbacks, scheduler_events for daily or cron tasks, and doctype_js for client scripts. Keep hooks.py limited to configuration only—import logic from separate modules and restart bench after changes.

How do I run background jobs in Frappe?▼

Use `frappe.enqueue` with a method path, queue name, and timeout to schedule long-running work on background workers. Keep jobs idempotent and retry-safe, and use `frappe.publish_realtime` to notify clients when jobs complete.

Why are my Frappe hooks not firing?▼

Hooks fail when the module path in hooks.py does not match the actual Python file structure, when the app is not in the site's installed_apps, or when bench was not restarted after editing hooks.py. Verify paths, run install-app, and restart bench.

Does Frappe support overriding DocType controllers across versions?▼

Yes, but the mechanism varies by version. Frappe v16+ offers `extend_doctype_class` as a safer alternative to full `override_doctype_class` replacement; for older versions, use override hooks sparingly and guard version-specific features with capability checks.

How do I add translations to a Frappe app?▼

Mark strings with `frappe._()` in Python or `__()` in JavaScript, then store translations as CSV files per language under `your_app/translations/` (e.g., fr.csv). Use stable, non-dynamic strings as translation keys for reliable matching.