I’m a fresh Frappe developer and looking for AI tools to support my learning.
I’ve noticed that ChatGPT sometimes doesn’t provide the most accurate or in-depth responses regarding Frappe’s structure and best practices. Can anyone suggest a list of AI tools or resources that are specifically useful for Frappe development and will help me in my career?
Your recommendations will be greatly appreciated!
I use Gemini, but regardless of the tool, using the correct approach is very important.
Uploading files from the GitHub page helps a lot, and with Gemini rolling out the ability to upload a GitHub project based on URL, this can be very helpful with development.
Check out Deepseek
the entire website was derived out of Deepseek
i have a zero knowledge on programming or building websites
had tried both chatgpt and deepseek for a long time
for a similar prompt, deepseek provides better code
check out the page
for scripting, i have found chatgpt to be better
have used lots of scripts, for example for the product registration page
use your entire bench as workspace, enable indexing (exclude node modules, python env, JS build folders)
also add docs.frappe.io so all documentation is indexed and available to the LLMs
instruct agent to look into existing files, or for specific keywords
Example
Find User.name email assumptions
Exported on 10.6.2025 from Cursor (1.0.0)
User
Please search the code base to find all places where User.name is assumed to be an email address
Cursor
I’ll search the codebase to find all places where User.name is assumed to be an email address. Let me start with a comprehensive search strategy.
Let me search for more specific patterns where User.name is used as an email address.
Let me look at the get_email_address function more closely:
Now let me check the User doctype more closely:
Let me search for more patterns where User.name is used as email:
Let me check for patterns where user is created with email as name:
Let me look at the sign_up function to see how new users are created:
Let me check how users are created in other places:
Let me check the test files to understand better:
Now let me search for more patterns where User.name is used as email in JavaScript files:
Let me check this file:
Now let me search for more patterns in the codebase:
Let me look at the request_for_quotation.py file to see how it uses user.name as email:
Now let me search for more patterns in the codebase where User.name is used as email:
Based on my comprehensive search of the codebase, I’ve found all the places where User.name is assumed to be an email address. Here’s a summary of my findings:
Places where User.name is assumed to be an email address:
1. User Document Creation and Validation
apps/frappe/frappe/core/doctype/user/user.py (line 178): In the validate() method, self.email = self.name is set for non-standard users
apps/frappe/frappe/core/doctype/user/user.py (line 179): self.validate_email_type(self.name) validates that the user name is a valid email
apps/frappe/frappe/core/doctype/user/user.py (line 606): The validate_email_type() method uses validate_email_address() to ensure the name is a valid email
apps/frappe/frappe/core/doctype/user/user.py (line 628): After rename, frappe.db.set_value("User", new_name, "email", new_name) sets email to the new name
2. User Sign Up and Creation
apps/frappe/frappe/core/doctype/user/user.py (line 1044): In sign_up(), new users are created with "email": email and the document name becomes the email
apps/frappe/frappe/core/doctype/user/test_user.py (line 56): Test creates user with email=user_id
apps/frappe/frappe/tests/test_assign.py (line 23): Creates user with "email": "test@example.com"
3. Email Utilities
apps/frappe/frappe/utils/__init__.py (line 98): In get_formatted_email(), if no email is found, it tries validate_email_address(user) as a fallback, assuming the user parameter might be an email
4. Personal Data Deletion Request
apps/frappe/frappe/website/doctype/personal_data_deletion_request/personal_data_deletion_request.py (line 65): Uses frappe.utils.validate_email_address(self.email, throw=True) in autoname
apps/frappe/frappe/website/doctype/personal_data_deletion_request/personal_data_deletion_request.py (line 83): Gets user with frappe.get_doc("User", self.email)
apps/frappe/frappe/public/js/frappe/utils/user.js (line 89): get_formatted_email() function uses email parameter which could be user name
7. Various Get User by Email Patterns
Multiple files use patterns like frappe.get_doc("User", email) or frappe.db.get_value("User", {"email": email_id}) which rely on the fact that User.name is the email address
8. Test Files
apps/frappe/frappe/tests/test_doc_ref.py (line 20): Tests that user.name == "test@example.com"
Various test files create users with email as the document name
This assumption that User.name is an email address is deeply embedded in the Frappe framework’s design. The User doctype uses the email address as the primary key (name field), which is enforced in the validation logic and used throughout the codebase for user identification and email communication.