Best AI tool to use frappe developers

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.

However, no tool is perfect.

Thank you for you kind responses

Try Claude AI, Good for Frappe Development

https://claude.ai

2 Likes

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

its all boils down to the prompt
Regards
Hemanth

I use both gemiii/(bard) and deepseek, sometimes deepseek response is better than gemini.

Use MCP server with Claude desktop.

I was able to achieve the following with MCP server

  1. Structure/finalize the approach to the requirements using prompts
  2. Set up necessary tools for MCP set up like GitHub, Frappe, AWS etc
  3. Instruct your prompt to do the needful.

Boom!!
Everything will be archestrated by Claude

  • 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)

5. Contact Creation

  • apps/erpnext/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py (line 218): Sets contact.email_id = user.name

  • apps/frappe/frappe/contacts/doctype/contact/contact.py (line 82): Sets self.user = frappe.db.get_value("User", {"email": self.email_id})

6. JavaScript Code

  • apps/frappe/frappe/public/js/frappe/desk.js (line 73): Compares email_list[u] === frappe.user.name

  • 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.

1 Like