| # UI development | 
 |  | 
 | Some tips to get started with the UI development: | 
 |  | 
 | ## Development environment | 
 |  | 
 | If you're looking for an IDE to write the TypeScript code, Visual Studio Code | 
 | works well out of the box. WebStorm or IntelliJ Idea Ultimate (Community does | 
 | not have JavaScript/TypeScript support) also work really well. The code is | 
 | located in the `ui` folder. | 
 |  | 
 | ## Working with devserver | 
 |  | 
 | See [Build Instructions](build-instructions.md) page for the details about | 
 | starting the local development server. | 
 |  | 
 | The devserver has a live reload functionality: once you make a change in | 
 | TypeScript files, the resulting code will be recompiled and the page is going to | 
 | reload automatically. By default, this logic uses a timeout in order to prevent | 
 | successive reloads on rapid changes. This logic can be disabled via | 
 | development-only "Rapid live reload" flag in the UI. Disabling it will reload | 
 | the page earlier, at the cost of sometimes making multiple reloads in a row. | 
 |  | 
 | ## Mithril components | 
 |  | 
 | Perfetto UI uses the [Mithril](https://mithril.js.org/) library for rendering | 
 | the interface. The majority of the components in the codebase use | 
 | [class components](https://mithril.js.org/components.html#classes). When Mithril | 
 | is imported via `m` alias (as it is usually done in the codebase), the class | 
 | component should extend `m.ClassComponent`, which has an optional generic | 
 | parameter allowing the component to take inputs. The entry point of class | 
 | components is a `view` method, returning a tree of virtual DOM elements to be | 
 | rendered when the component is present on the page. | 
 |  | 
 | ## Component state | 
 |  | 
 | Local state of components can reside in class members and accessed directly in | 
 | methods via accessing `this`. State that is shared across different components | 
 | is stored in the `State` class definition, and should be modified via | 
 | implementing a new action in `src/common/actions.ts`. A new field added to | 
 | `State` should be initialized in `src/common/empty_state.ts`. | 
 |  | 
 | There are restrictions on whan can be used in the global state: plain JS objects | 
 | are OK, but class instances are not (this limitation is due to state | 
 | serialization: the state should be a valid JSON object). If storing class | 
 | instances (like `Map` and `Set` data structures) is necessary, these can be | 
 | stored in the `NonSerializableState` portion of the state, that is omitted from | 
 | saving into JSON objects. |