diff --git a/ivette/.eslintignore b/ivette/.eslintignore
index a5bbd22266ef469c4109f7160c1a950e81386b5a..da6324fae8fd497e4a06a672c5e08272d520ec22 100644
--- a/ivette/.eslintignore
+++ b/ivette/.eslintignore
@@ -6,5 +6,10 @@ dist
 coverage
 # don't lint tsc output, if any
 lib
-# don't lint dome, for the moment
-src/dome
\ No newline at end of file
+# don't lint the generated API
+src/api
+# lint Dome step by step
+src/dome/src/renderer/controls
+src/dome/src/renderer/layout
+src/dome/src/renderer/table
+src/dome/src/renderer/data
diff --git a/ivette/.eslintrc.js b/ivette/.eslintrc.js
index ebdbbb656e9a0007b96ff7f378c22fd3c3401f78..a06e294a3f4d8da672398dd03d0225f6342b0804 100644
--- a/ivette/.eslintrc.js
+++ b/ivette/.eslintrc.js
@@ -15,6 +15,10 @@ module.exports = {
   parserOptions: {
     project: './tsconfig.json',
   },
+  settings: {
+    // Electron is in devDependencies because of its special build system
+    "import/core-modules": [ "electron" ]
+  },
   rules: {
     "react/display-name": "off",
     // Be more strict on usage of useMemo and useRef
diff --git a/ivette/src/dome/src/renderer/dialogs.tsx b/ivette/src/dome/src/renderer/dialogs.tsx
index b4871cc69e9b1b6864542ce6e495a09554c340ba..e5bc3fa9f1d88b946358fdaff1577acb0c937a67 100644
--- a/ivette/src/dome/src/renderer/dialogs.tsx
+++ b/ivette/src/dome/src/renderer/dialogs.tsx
@@ -15,11 +15,11 @@ import * as System from 'dome/system';
 export interface DialogButton<A> {
   label?: string;
   value?: A;
-};
+}
 
 const defaultItems: DialogButton<boolean>[] = [
   { value: undefined },
-  { value: true, label: 'Ok' }
+  { value: true, label: 'Ok' },
 ];
 
 const valueLabel = (v: any) => {
@@ -27,19 +27,21 @@ const valueLabel = (v: any) => {
     case undefined: return 'Cancel';
     case true: return 'Ok';
     case false: return 'No';
-    default: return '' + v;
+    default: return `${v}`;
   }
 };
 
-const itemLabel = ({ value, label }: DialogButton<any>) =>
-  (label || valueLabel(value));
+const itemLabel = ({ value, label }: DialogButton<any>) => (
+  (label || valueLabel(value))
+);
 
-const isDefault = ({ value, label }: DialogButton<any>) =>
-  (value === true || label === 'Ok' || label === 'Yes');
-
-const isCancel = ({ value, label }: DialogButton<any>) =>
-  (!value || label === 'Cancel' || label === 'No');
+const isDefault = ({ value, label }: DialogButton<any>) => (
+  (value === true || label === 'Ok' || label === 'Yes')
+);
 
+const isCancel = ({ value, label }: DialogButton<any>) => (
+  (!value || label === 'Cancel' || label === 'No')
+);
 
 export type MessageKind = 'none' | 'info' | 'error' | 'warning';
 
@@ -50,7 +52,7 @@ export interface MessageProps<A> {
   message: string;
   /** Message details (short sentence). */
   details?: string;
-  /** Message buttons.*/
+  /** Message buttons. */
   buttons?: DialogButton<A>[];
   /** Default button's value. */
   defaultValue?: A;
@@ -83,11 +85,11 @@ export async function showMessageBox<A>(
     details,
     defaultValue,
     cancelValue,
-    buttons = (defaultItems as DialogButton<A | boolean>[])
+    buttons = (defaultItems as DialogButton<A | boolean>[]),
   } = props;
 
   const labels = buttons.map(itemLabel);
-  let defaultId =
+  const defaultId =
     defaultValue === undefined
       ? buttons.findIndex(isDefault)
       : buttons.findIndex((a) => a.value === defaultValue);
@@ -101,11 +103,15 @@ export async function showMessageBox<A>(
   return remote.dialog.showMessageBox(
     remote.getCurrentWindow(),
     {
-      type: kind, message,
-      detail: details, defaultId, cancelId, buttons: labels
-    }
+      type: kind,
+      message,
+      detail: details,
+      defaultId,
+      cancelId,
+      buttons: labels,
+    },
   ).then((result) => {
-    let itemIndex = result ? result.response : -1;
+    const itemIndex = result ? result.response : -1;
     return itemIndex ? buttons[itemIndex].value : cancelValue;
   });
 }
@@ -115,7 +121,7 @@ export async function showMessageBox<A>(
 // --------------------------------------------------------------------------
 
 const defaultPath =
-  (path: string) => filepath.extname(path) ? filepath.dirname(path) : path;
+  (path: string) => (filepath.extname(path) ? filepath.dirname(path) : path);
 
 export interface FileFilter {
   /** Filter name. */
@@ -165,34 +171,39 @@ export interface OpenDirProps extends FileDialogProps {
 
    The promise is never rejected.
  */
-export async function showOpenFile(props: OpenFileProps): Promise<string | undefined> {
+export async function showOpenFile(
+  props: OpenFileProps,
+): Promise<string | undefined> {
   const { message, label, path, hidden = false, filters } = props;
   return remote.dialog.showOpenDialog(
     remote.getCurrentWindow(),
     {
-      message, buttonLabel: label,
+      message,
+      buttonLabel: label,
       defaultPath: path && defaultPath(path),
       properties: (hidden ? ['openFile', 'showHiddenFiles'] : ['openFile']),
       filters,
-    }
-  ).then(result => {
+    },
+  ).then((result) => {
     if (!result.canceled && result.filePaths && result.filePaths.length > 0)
       return result.filePaths[0];
-    else
-      return undefined;
+    return undefined;
   });
 }
 
 /**
    Show a dialog for opening files multiple files.
 */
-export async function showOpenFiles(props: OpenFileProps): Promise<string[] | undefined> {
+export async function showOpenFiles(
+  props: OpenFileProps,
+): Promise<string[] | undefined> {
   const { message, label, path, hidden, filters } = props;
 
   return remote.dialog.showOpenDialog(
     remote.getCurrentWindow(),
     {
-      message, buttonLabel: label,
+      message,
+      buttonLabel: label,
       defaultPath: path && defaultPath(path),
       properties: (
         hidden
@@ -200,16 +211,14 @@ export async function showOpenFiles(props: OpenFileProps): Promise<string[] | un
           : ['openFile', 'multiSelections']
       ),
       filters,
-    }
-  ).then(result => {
+    },
+  ).then((result) => {
     if (!result.canceled && result.filePaths && result.filePaths.length > 0)
       return result.filePaths;
-    else
-      return undefined;
+    return undefined;
   });
 }
 
-
 // --------------------------------------------------------------------------
 // --- saveFile dialog
 // --------------------------------------------------------------------------
@@ -230,11 +239,12 @@ export async function showSaveFile(
   return remote.dialog.showSaveDialog(
     remote.getCurrentWindow(),
     {
-      message, buttonLabel: label,
+      message,
+      buttonLabel: label,
       defaultPath: path,
-      filters
-    }
-  ).then(({ canceled, filePath }) => canceled ? undefined : filePath);
+      filters,
+    },
+  ).then(({ canceled, filePath }) => (canceled ? undefined : filePath));
 }
 
 // --------------------------------------------------------------------------
@@ -257,6 +267,7 @@ export async function showOpenDir(
   switch (System.platform) {
     case 'macos': properties.push('createDirectory'); break;
     case 'windows': properties.push('promptToCreate'); break;
+    default: break;
   }
 
   return remote.dialog.showOpenDialog(
@@ -265,13 +276,12 @@ export async function showOpenDir(
       message,
       buttonLabel: label,
       defaultPath: path,
-      properties
-    }
-  ).then(result => {
+      properties,
+    },
+  ).then((result) => {
     if (!result.canceled && result.filePaths && result.filePaths.length > 0)
       return result.filePaths[0];
-    else
-      return undefined;
+    return undefined;
   });
 }
 
diff --git a/ivette/src/dome/src/renderer/errors.tsx b/ivette/src/dome/src/renderer/errors.tsx
index aebd9ec39ef3903c740957cfba9b9aefd5f7e0ab..b8cfc300071c79342ab28a8912b3296e5b3c1f11 100644
--- a/ivette/src/dome/src/renderer/errors.tsx
+++ b/ivette/src/dome/src/renderer/errors.tsx
@@ -19,7 +19,7 @@ import { Button } from 'dome/controls/buttons';
    Alternative renderer in case of error.
    @param reload - callback for re-rendering the faulty component
  */
-export interface renderError {
+export interface ErrorRenderer {
   (error: any, info: any, reload: () => void): JSX.Element;
 }
 
@@ -27,7 +27,7 @@ export interface CatchProps {
   /** Name of the error boundary. */
   label?: string;
   /** Alternative renderer callback in case of errors. */
-  onError?: JSX.Element | renderError;
+  onError?: JSX.Element | ErrorRenderer;
 }
 
 interface CatchState {
@@ -66,16 +66,18 @@ export class Catch extends React.Component<CatchProps, CatchState, {}> {
       const { onError, label = 'Error' } = this.props;
       if (typeof (onError) === 'function')
         return onError(error, info, this.reload);
-      else
-        return (
-          <div>
-            <Button icon='WARNING' kind='warning'
-              title={error}
-              onClick={this.logerr} />
-            <Button icon='RELOAD' onClick={this.reload} />
-            <Label>{label}</Label>
-          </div>
-        );
+      return (
+        <div>
+          <Button
+            icon="WARNING"
+            kind="warning"
+            title={error}
+            onClick={this.logerr}
+          />
+          <Button icon="RELOAD" onClick={this.reload} />
+          <Label>{label}</Label>
+        </div>
+      );
     }
     return this.props.children || null;
   }