diff --git a/dotfiles/.local/bin/commands b/dotfiles/.local/bin/commands
index 8c1d8f2..442fd8f 100755
--- a/dotfiles/.local/bin/commands
+++ b/dotfiles/.local/bin/commands
@@ -114,6 +114,109 @@ def resilient_vlc(stream=None):
                             pass
         time.sleep(1.0)
 
+def eternal_firefox(
+    tabs=None,
+    profile=None,
+    group_name=None,
+    window_position=None,
+    debug=None,
+):
+    import os
+    import datetime
+    import pprint
+    import subprocess
+    import time
+    if debug is None:
+        debug = False
+    if tabs is None:
+        raise RuntimeError('no tabs provided')
+    if profile is None:
+        raise RuntimeError('no profile provided')
+    if group_name is None:
+        raise RuntimeError('no group provided')
+    if window_position is None:
+        #window_position = '1,600,0,600,540'
+        raise RuntimeError('no window-position provided')
+    while True:
+        os.system(r'''date''')
+        with subprocess.Popen([
+            'firefox',
+            '-P', profile,
+            *tabs,
+        ]) as p:
+            try:
+                if debug:
+                    assert subprocess.check_call(['notify-send', '%s:Starting' % group_name]) == 0
+
+                #t3 = ''
+                for k in range(300):
+                    t1 = subprocess.check_output(r'''
+                        swaymsg -t get_tree | jq -r '..|try select(.pid== %d)'
+                    ''' % p.pid, shell=True).decode('utf-8')
+                    if len(t1) > 10:
+                        break
+                    #time.sleep(0.1)
+                    #t1 = subprocess.check_output(['wmctrl', '-p', '-l']).decode('utf-8')
+                    #t4 = [o for o in t1.splitlines() if str(p.pid) in o]
+                    #if len(t4) == 1:
+                    #    t3 = t4[0]
+                    #    break
+
+                #if t3 == '':
+                #    raise RuntimeError
+
+                #t2 = t3.split()[0]
+                #assert os.system('wmctrl -i -r %s -e %s' % (t2, window_position)) == 0
+                assert os.system(r'''
+                    swaymsg '[pid="{{PID}}"] move absolute position {{X}}px {{Y}}px'
+                '''.replace('{{PID}}', str(p.pid)) \
+                    .replace('{{X}}', str(window_position[1])) \
+                    .replace('{{Y}}', str(window_position[2]))) == 0
+
+                #assert os.system('wmctrl -i -r %s -b add,below' % t2) == 0
+
+                if False:
+                    for tab in tabs[1:]:
+                        time.sleep(10)
+                        assert subprocess.check_call([
+                            'firefox',
+                            '-P', profile,
+                            '--new-tab',
+                            tab,
+                        ]) == 0
+
+
+                if debug:
+                    assert subprocess.check_call(['notify-send', '%s:Started' % group_name]) == 0
+
+                start = datetime.datetime.now()
+                is_to_restart = lambda : (datetime.datetime.now() - start).total_seconds() >= 900 * 4
+                while not is_to_restart():
+                    if not p.poll() is None:
+                        break
+                    time.sleep(10)
+
+                if debug:
+                    assert subprocess.check_call(['notify-send', '%s:Closing' % group_name]) == 0
+
+                #assert os.system('wmctrl -i -c %s' % t2) == 0
+                assert os.system(r'''
+                    swaymsg '[pid="%d"] kill'
+                ''' % (p.pid,)) == 0
+
+            except:
+                import traceback
+                import pprint
+                pprint.pprint(traceback.format_exc())
+            finally:
+                try:
+                    p.wait(20)
+                except subprocess.TimeoutExpired:
+                    pprint.pprint([p.pid, '20 seconds timeout', 'kill'])
+                    p.kill()
+                if debug:
+                    assert subprocess.check_call(['notify-send', '%s:Closed' % group_name]) == 0
+
 def status():
     return ' | '.join([
         subprocess.check_output(o, shell=True).decode('utf-8').strip()
@@ -196,6 +299,14 @@ try:
         eternal_oom()
     elif sys.argv[1] == 'resilient-vlc':
         resilient_vlc(sys.argv[2:])
+    elif sys.argv[1] == 'eternal-firefox':
+        eternal_firefox(
+            profile=sys.argv[2],
+            group_name=sys.argv[3],
+            window_position=json.loads(sys.argv[4]),
+            debug=bool(sys.argv[5]),
+            tabs=sys.argv[6:],
+        )
     else:
         raise NotImplementedError
 except: