Creating a New App
To create a brand-new application with Studio:
- Click the main menu (grid icon) to go to the home screen.
- Click the Studio icon (pencil) — this opens the Studio home, not tied to any specific app.
- Click New App.
- The wizard asks for:
- App name — shown in the menu (e.g., "Equipment Requests")
- Menu icon — pick from the icon palette
- Menu color — background color for the app tile
- Click Build your app. Studio creates the app, model, and views and drops you into Studio mode on the new app's form view.
Creating a New Model
When you use the New App wizard, Studio automatically creates an underlying model. The model technical name follows the pattern x_<app_name_snake_case>. For example, an app named "Equipment Requests" gets the model x_equipment_requests.
You can also create additional models from within an existing Studio session by using the New Model option under the Views tab in the left panel. This is useful when you need related sub-models (e.g., a "Request Line" model linked to the main model).
Every new Studio model comes with a default set of built-in fields: id, name (display name), create_date, write_date, create_uid, write_uid, and active (for archiving). You don't need to add these — they come automatically.
Adding Fields to Your Model
After the wizard completes, you land on the empty form view of your new model. Add fields exactly as described in the Custom Fields page:
- Use the Components tab to drag a New Field onto the form.
- Choose the type and configure properties.
- Repeat for all the fields your model needs.
You can also add a Status Bar component from the Components tab to give the model a pipeline-style state machine (similar to sale orders or CRM leads). Studio creates a Selection field for the stages and adds the statusbar widget automatically.
Configuring Views for Custom Models
Studio auto-generates three views for every new model:
| View type | Auto-generated content |
|---|---|
| Form | Name field and chatter (messaging thread) |
| List | Name column and creation date |
| Kanban | Name displayed on card, grouped by status if a statusbar exists |
Use the Views tab in the Studio left panel to switch between these views and customize each one. Add, remove, and reorder fields as needed. You can also enable or disable view types (e.g., hide the kanban view if it isn't useful for your model) from the Views tab.
Access Rights for Custom Models
When Studio creates a new model and app, it also sets up access rights automatically. By default, all internal users (base.group_user) get full CRUD access to the new model. Studio manages this via ir.model.access records created in the background.
If you need more granular control:
- Go to Settings → Technical → Security → Access Rights and filter for your model name (e.g.,
x_equipment_requests). - Modify or add access rules there.
- Alternatively, export to a module (see Studio vs Module) and define proper
res.groupsand CSV access rules in code.
Studio gives all internal users full access by default. It does not create app-specific user groups (e.g., "Equipment Manager" vs "Equipment User"). If you need role-based access for your custom app, you must set that up manually or export to a module and define groups in code.
Limitations of Studio Models
Studio models are powerful for simple data collection and tracking use cases, but they have important limitations you will eventually run into:
| Limitation | Workaround |
|---|---|
| No Python methods or business logic | Export to module and add Python code |
No @api.constrains (validation rules) | Use required fields as a substitute; complex validation needs Python |
No @api.onchange (field triggers) | Limited via Formula fields; full onchange needs Python |
| No scheduled actions | Use Studio Automations with time-based triggers instead |
No ORM inheritance (_inherit) | Must be a custom module to extend with Python |
| No custom widgets | Use available Studio widgets; custom widgets need JavaScript development |
| Not version-controlled by default | Export to module ZIP and commit to git |
When you hit these limitations, the right move is to export the Studio app as a module (using the Export button in Studio), unzip it, and extend it with Python code. The exported module includes all your fields and views as a starting point — you don't lose the work you did in Studio.
📋 Key Points
- Use the New App wizard (from Studio home) to create an app, model, and default views in one step.
- Studio model names get the
x_prefix (e.g.,x_equipment_requests). - All internal users get full CRUD access to new Studio models by default — add granular access rights manually in Technical settings.
- Auto-generated views: form (name + chatter), list (name + date), kanban — customize each from the Views tab.
- Status Bar component creates a pipeline-stage field automatically.
- Studio models cannot have Python logic, ORM constraints, onchange handlers, or inheritance — export to a module for those features.
FAQ
Yes. In Studio, open the app and click the Views tab in the left panel. There is a section for managing the app's menu structure. You can add sub-menu items pointing to list views of different models, allowing you to build a multi-section app with separate menus for, say, "Requests" and "Categories".
If Studio is uninstalled, Studio-created apps, models, and data are removed as well. This is a destructive operation. Before uninstalling Studio, export all your customizations as a module and install that module separately so your apps persist independently of Studio.
Yes. Studio automatically adds the chatter to new model forms. If you removed it, open the form in Studio, go to the Components tab, and drag the Chatter component back onto the form. The chatter requires the model to inherit mail.thread — Studio handles this automatically for new models.
Yes. Open an existing app in Studio, go to the Views tab in the left panel, and use the "New Model" option to create a new model. Then add a sub-menu entry in the app's menu structure pointing to this new model. This way you extend an existing app with a new data object without creating a separate app icon.