Epesi is a PHP framework: every feature you'll build is a small set of PHP classes following a shared convention, wired into the same low-code system that powers the CRM/ERP screens you already use. If you know PHP, HTML, and basic SQL, you know most of what you need.
Start here: Architecture Overview explains how modules, templates, and data persistence fit together — read it before the hands-on lessons below, since they use these concepts without re-explaining them. Then follow the tutorial in order, starting with Using Other Modules, through a complete worked example in Hello World, to the Utils/RecordBrowser and Utils/RBO reference pages.
A few things that don't fit anywhere else in the tutorial but will save you time while developing:
You will often find yourself in a situation where you will need to refresh the content of your module. Browser refresh will completely restart epesi - which will force you to navigate (via menu/launchpad/applet) to reach your module again. You may, instead, click on epesi logo in upper-left corner. This will cause soft refresh of the page and allow you to check quickly changes you applied in your module. Please keep in mind that epesi is very sensitive to broken javascript code and often such code will block the refresh this way. Find that broken code, use full refresh and it should work from that point.
Since EPESI 1.4 your classes can be auto-loaded!
Just name them properly. Epesi uses underscore-separated class names to emulate namespaces rather than PHP's native namespace keyword — this is a framework convention, not a PHP-version limitation, and it applies the same way on the current PHP 8.x. If your module is Premium/MyModule your custom class is Premium_MyModule_Foo it should be in file modules/Premium/MyModule/Foo.php.
Generic procedure to autoload your custom class is to replace all underscores with directory separator and prepend modules/.
About EPESI modules
Don't bother that modules classes (Main, Common, Install) don't apply this naming rule. They get loaded when needed, but only if module is installed.