Install several Odoo apps, like CRM, accounting, and inventory, and they combine into an open source Python ERP that your own modules extend. In Odoo, [everything starts and ends with modules](https://www.odoo.com/documentation/latest/developer/tutorials/server_framework_101/01_architecture.html#odoo-modules): each app you install is one, and so is each change you make. [Odoo Community is the free and open source edition](https://www.odoo.com/documentation/latest/administration.html#editions). Enterprise is [extra modules installed on top of Community](https://www.odoo.com/documentation/latest/developer/tutorials/server_framework_101/01_architecture.html#odoo-editions), and its license [allows running it only with an Enterprise subscription](https://www.odoo.com/documentation/latest/legal/licenses.html#odoo-enterprise-license). Where you host Odoo decides whether your own Python code runs on it. [Odoo Online doesn't run custom modules](https://www.odoo.com/documentation/latest/administration/odoo_online.html), but [Studio customizes Odoo there without code](https://www.odoo.com/documentation/latest/applications/studio.html). Odoo.sh, Odoo's official cloud platform, [deploys your modules from a branch of your GitHub repository](https://www.odoo.com/documentation/latest/administration/odoo_sh/getting_started/create.html#push-modules-in-production). Your own server runs whatever modules its addons path points to. To develop modules, Odoo's developer docs prefer [a source install](https://www.odoo.com/documentation/latest/developer/tutorials/setup_guide.html), which runs Odoo from its source code. Keep your modules in a directory of their own, and [start the server with `odoo-bin`](https://www.odoo.com/documentation/latest/administration/on_premise/source.html#install-source-running-odoo), adding that directory to `--addons-path`. Then work through [Server framework 101](https://www.odoo.com/documentation/latest/developer/tutorials/server_framework_101.html), which builds one module from scratch. A module is a Python package whose `__manifest__.py` [names the module and the modules it depends on](https://www.odoo.com/documentation/latest/developer/tutorials/server_framework_101/02_newapp.html#prepare-the-addon-directory). Business objects are [Python classes extending `Model`](https://www.odoo.com/documentation/latest/developer/tutorials/server_framework_101/03_basicmodel.html#object-relational-mapping), whose fields the ORM maps to database columns. Give each model access rights, since [without them, no user can access its data](https://www.odoo.com/documentation/latest/developer/tutorials/server_framework_101/04_securityintro.html#access-rights). To change an app Odoo ships, extend it from your own module instead of editing its code. [Model inheritance](https://www.odoo.com/documentation/latest/developer/tutorials/server_framework_101/12_inheritance.html#model-inheritance) adds fields and overrides methods on a model another module defines, and [view inheritance](https://www.odoo.com/documentation/latest/developer/tutorials/server_framework_101/12_inheritance.html#view-inheritance) applies your extension views on top of the originals. When a feature joins two apps, put it in [a link module](https://www.odoo.com/documentation/latest/developer/tutorials/server_framework_101/13_other_module.html#link-module), so each app still installs on its own. Before you write a module, [check whether Odoo already covers the case](https://www.odoo.com/documentation/latest/developer/tutorials/server_framework_101/02_newapp.html#the-real-estate-advertisement-module). A database with custom modules [can't be upgraded until they're ready for the new version](https://www.odoo.com/documentation/latest/administration/upgrade.html), so each module you skip is one less to port.