diff --git a/ivette/.eslintrc.js b/ivette/.eslintrc.js
index 616c6cfcd375dff57f7bb757cec10f553d5b19a9..7c42af4153fd5aab1724dafbb91c50ee1613214c 100644
--- a/ivette/.eslintrc.js
+++ b/ivette/.eslintrc.js
@@ -17,7 +17,7 @@ module.exports = {
   },
   settings: {
     // Electron is in devDependencies because of its special build system
-    "import/core-modules": [ "electron" ]
+    "import/core-modules": [ 'electron', 'react-hot-loader' ]
   },
   rules: {
     "react/display-name": "off",
diff --git a/ivette/src/dome/src/renderer/data/json.ts b/ivette/src/dome/src/renderer/data/json.ts
index c9e6752c9251fad51513131ef2a3a2fb8b9b914e..f6ce22153b9d82e50ce33869e4e741573f6549dc 100644
--- a/ivette/src/dome/src/renderer/data/json.ts
+++ b/ivette/src/dome/src/renderer/data/json.ts
@@ -445,7 +445,7 @@ export function jKey<K>(kd: K): Loose<key<K>> {
 
 /** Decoder for `index<K>` numbers. */
 export function jIndex<K>(kd: K): Loose<index<K>> {
-  return (js: json) => typeof js === 'number' ? forge(kd, js) : undefined;
+  return (js: json) => (typeof js === 'number' ? forge(kd, js) : undefined);
 }
 
 export type dict<A> = { [key: string]: A };
diff --git a/ivette/src/dome/src/renderer/data/settings.ts b/ivette/src/dome/src/renderer/data/settings.ts
index 3cf6d7cd231d0554031d60b11f9e239fdc42329e..51ef3fcd73e7d3c48ea19f45cf4e2fca3213aa9d 100644
--- a/ivette/src/dome/src/renderer/data/settings.ts
+++ b/ivette/src/dome/src/renderer/data/settings.ts
@@ -62,26 +62,30 @@ export class GlobalSettings<A> {
 
 /** Boolean settings with `true` default. */
 export class GTrue extends GlobalSettings<boolean> {
-  constructor(name: string) { super(name, JSON.jBoolean, JSON.identity, true); }
+  constructor(name: string) {
+    super(name, JSON.jBoolean, JSON.identity, true);
+  }
 }
 
 /** Boolean settings with `false` default. */
 export class GFalse extends GlobalSettings<boolean> {
-  constructor(name: string) { super(name, JSON.jBoolean, JSON.identity, false); }
+  constructor(name: string) {
+    super(name, JSON.jBoolean, JSON.identity, false);
+  }
 }
 
 /** Numeric settings (default is zero unless specified). */
 export class GNumber extends GlobalSettings<number> {
-  constructor(name: string, defaultValue: number = 0) {
+  constructor(name: string, defaultValue = 0) {
     super(name, JSON.jNumber, JSON.identity, defaultValue);
-  };
+  }
 }
 
 /** String settings (default is `""` unless specified). */
 export class GString extends GlobalSettings<string> {
-  constructor(name: string, defaultValue: string = '') {
+  constructor(name: string, defaultValue = '') {
     super(name, JSON.jString, JSON.identity, defaultValue);
-  };
+  }
 }
 
 /** Smart constructor for optional (JSON serializable) data. */
@@ -111,8 +115,8 @@ export class GObject<A extends JSON.json> extends GlobalSettings<A> {
 // --- Generic Settings (private)
 // --------------------------------------------------------------------------
 
-type patch = { key: string, value: JSON.json };
-type driver = { evt: string, ipc: string, broadcast: boolean };
+type patch = { key: string; value: JSON.json };
+type driver = { evt: string; ipc: string; broadcast: boolean };
 
 class Driver {
 
@@ -161,7 +165,8 @@ class Driver {
             }
           });
           SysEmitter.emit(this.evt);
-        });
+        },
+      );
     }
     // --- Closing Events
     ipcRenderer.on('dome.ipc.closing', () => {
@@ -241,7 +246,7 @@ function useSettings<A>(
       const event = D.evt;
       const callback = () => setValue(loader());
       SysEmitter.on(event, callback);
-      return () => { SysEmitter.off(event, callback); }
+      return () => { SysEmitter.off(event, callback); };
     }
     return undefined;
   });
@@ -251,7 +256,7 @@ function useSettings<A>(
       setValue(newValue);
       if (K) D.save(K, S.encoder(newValue));
     }
-  }, [S, D, K]);
+  }, [S, D, K, value]);
   return [value, updateValue];
 }
 
@@ -304,7 +309,7 @@ export function useWindowSettings<A extends JSON.json>(
   return useSettings({
     decoder,
     encoder: JSON.identity,
-    defaultValue
+    defaultValue,
   }, WindowDriver, key);
 }
 
@@ -318,7 +323,7 @@ export function useWindowSettingsData<A>(
   return useSettings({
     decoder,
     encoder,
-    defaultValue
+    defaultValue,
   }, WindowDriver, key);
 }
 
diff --git a/ivette/src/dome/src/renderer/data/states.ts b/ivette/src/dome/src/renderer/data/states.ts
index 22da71e13988dcad55bc25d67cd3e50882eae19d..030a2180b9095f35002e52801dd965da59a3e0d2 100644
--- a/ivette/src/dome/src/renderer/data/states.ts
+++ b/ivette/src/dome/src/renderer/data/states.ts
@@ -16,17 +16,17 @@ import isEqual from 'react-fast-compare';
 // --- State utilities
 // --------------------------------------------------------------------------
 
-/** Alias to `[state,setState]` returned values*/
+/** Alias to `[state,setState]` returned values */
 export type State<A> = [A, (newValue: A) => void];
 
 /** State field of an object state. */
-export function key<A, K extends keyof A>(
+export function keyOf<A, K extends keyof A>(
   state: State<A>,
   key: K,
 ): State<A[K]> {
   const [props, setProps] = state;
   return [props[key], (value: A[K]) => {
-    const newProps = Object.assign({}, props);
+    const newProps = { ...props };
     newProps[key] = value;
     setProps(newProps);
   }];
@@ -35,12 +35,12 @@ export function key<A, K extends keyof A>(
 /** State index of an array state. */
 export function index<A>(
   state: State<A[]>,
-  index: number,
+  idx: number,
 ): State<A> {
   const [array, setArray] = state;
-  return [array[index], (value: A) => {
+  return [array[idx], (value: A) => {
     const newArray = array.slice();
-    newArray[index] = value;
+    newArray[idx] = value;
     setArray(newArray);
   }];
 }
@@ -48,13 +48,16 @@ export function index<A>(
 /** Log state updates in the console. */
 export function debug<A>(msg: string, st: State<A>): State<A> {
   const [value, setValue] = st;
-  return [value, (v) => { console.log(msg, v); setValue(v); }];
+  return [value, (v) => {
+    setValue(v);
+    console.log(msg, v); // eslint-disable-line no-console
+  }];
 }
 
 /** Purely local value. No hook, no events, just a ref. */
 export function local<A>(init: A): State<A> {
   const ref = { current: init };
-  return [ref.current, (v) => ref.current = v];
+  return [ref.current, (v) => { ref.current = v; }];
 }
 
 // --------------------------------------------------------------------------
@@ -109,6 +112,6 @@ export function useGlobalState<A>(s: GlobalState<A>): State<A> {
     return () => s.off(setCurrent);
   }, [s]);
   return [current, s.setValue];
-};
+}
 
 // --------------------------------------------------------------------------
diff --git a/ivette/src/dome/template/webpack.renderer.js b/ivette/src/dome/template/webpack.renderer.js
index 5cba35d887a82293a2c5ee5c482eda406729fdd4..10183ca75614a75697b5faf8bcf74f11a418f06c 100644
--- a/ivette/src/dome/template/webpack.renderer.js
+++ b/ivette/src/dome/template/webpack.renderer.js
@@ -25,7 +25,7 @@ module.exports = {
       '@plugins':     path.resolve( __dirname , 'src/plugins' ),
       'dome/misc':    path.resolve( DOME , 'src/misc' ),
       'dome/system':  path.resolve( DOME , 'src/misc/system.js' ),
-      'dome$':        path.resolve( DOME , 'src/renderer/dome.js' ),
+      'dome$':        path.resolve( DOME , 'src/renderer/dome.ts' ),
       'dome':         path.resolve( DOME , 'src/renderer' ),
       'react-dom':    '@hot-loader/react-dom'
     }
diff --git a/ivette/webpack.renderer.js b/ivette/webpack.renderer.js
index e35b929d4766762beef45a01ecd3b55126716021..b58016474673ba099755a7fc001ff0c593efde98 100644
--- a/ivette/webpack.renderer.js
+++ b/ivette/webpack.renderer.js
@@ -31,7 +31,7 @@ module.exports = {
       '@plugins':     path.resolve( __dirname , 'src/plugins' ),
       'dome/misc':    path.resolve( DOME , 'src/misc' ),
       'dome/system':  path.resolve( DOME , 'src/misc/system.js' ),
-      'dome$':        path.resolve( DOME , 'src/renderer/dome.js' ),
+      'dome$':        path.resolve( DOME , 'src/renderer/dome.ts' ),
       'dome':         path.resolve( DOME , 'src/renderer' ),
       'react-dom':    '@hot-loader/react-dom'
     }