diff --git a/pomodoroprompt.py b/pomodoroprompt.py
index 1cec777..7cb3456 100644
--- a/pomodoroprompt.py
+++ b/pomodoroprompt.py
@@ -6,23 +6,39 @@ import prompt_window
 import time
 from datetime import datetime, timedelta
 from pathlib import Path
-from pytz import timezone
+from pytz import timezone, utc
+from prompt_toolkit import PromptSession
+from prompt_toolkit.history import FileHistory
+#from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
+from prompt_toolkit.completion import WordCompleter
 
-import pytz
+session = PromptSession(history=FileHistory(os.path.expanduser('~/.pomodoro_history')))
+# Move to a file:
+words = WordCompleter(['NCHFA', 'PECE', 'Housing Works', 'Internal'])
+#os.path.dirname(os.path.realpath(__file__))
+#completion_list = WordCompleter(history=FileHistory(os.path.dirname(os.path.realpath(__file__)) + '.auto_complete'))
 
 WORK_MIN = 25  # Minutes for a work session
 SHORT_MIN = 5  # Minutes for a short break
 LONG_MIN = 15  # Minutes for a long break (NOT YET IMPLEMENTED)
 INTERRUPTED_MIN = 1 # Minimum minutes to ask to record an interrupted Pomodoro
 QUIET = True
+GUI = True
 
 def pomodoro_prompt_plan(whatdid = ''):
     """ Ask about what task will be worked on (showing last thing worked on)
     """
-    text = "What're you gonna do?"
+    text = "What're you gonna do? "
     # NOTE: If we can do system notifications that when clicked will focus the terminal
     # running pomodoro prompt, that might be even better than the pop-up GUI text entry.
-    whatnext = prompt_window.prompt(prompt=text, task=whatdid)
+    if GUI:
+        whatnext = prompt_window.prompt(prompt=text, task=whatdid)
+    else:
+        whatnext = session.prompt(message = text + '\n',
+                                  default = whatdid or '',
+                                  vi_mode = True,
+                                  completer = words,
+                                  complete_while_typing = True).strip()
     # Pressing cancel returns None, but we want to just treat it as an empty string.
     if whatnext is None:
         whatnext = ''
@@ -31,8 +47,15 @@ def pomodoro_prompt_plan(whatdid = ''):
 def pomodoro_prompt_report(whatnext):
     """ Ask what task was completed, showing the last task claimed to be being worked on
     """
-    text = "What'd you do?"
-    whatdid = prompt_window.prompt(prompt=text, task=whatnext)
+    text = "What'd you do? "
+    if GUI:
+        whatdid = prompt_window.prompt(prompt=text, task=whatnext)
+    else:
+        whatdid = session.prompt(message = text + '\n',
+                                  default = whatnext or '',
+                                  vi_mode = True,
+                                  completer = words,
+                                  complete_while_typing = True).strip()
     # Pressing cancel returns None, but we want to just treat it as an empty string.
     if whatdid is None:
         whatdid = ''
@@ -64,7 +87,7 @@ def record_task(whatnext, whatdid, start, end=None):
     """ Record completed pomodoro to CSV
     """
     if end is None:
-        end = datetime.now(pytz.utc)
+        end = datetime.now(utc)
 
     filepath = prepare_file(start)
     if not os.path.isfile(filepath):
@@ -84,8 +107,8 @@ def str_minutes(time_diff):
 def countdown_to(until):
     """ Display a timer counting down to until
     """
-    while datetime.now(pytz.utc) <= until:
-        to_go = until-datetime.now(pytz.utc)
+    while datetime.now(utc) <= until:
+        to_go = until-datetime.now(utc)
         print('\r', str_minutes(to_go), sep='', end='')
         time.sleep(1)
 
@@ -107,20 +130,33 @@ def prepare_file(utc_start, ext='csv', daily=False):
     timelog_path += '.' + ext
     return timelog_path
 
+def bing():
+    if GUI:
+        from playsound import playsound
+        playsound('res/timesup.aac')
+    else:
+        sys.stdout.write('\a')
+        sys.stdout.flush()
+
 def main():
     whatdid = ''
+    global GUI, QUIET
+    if "--no-gui" in sys.argv:
+        GUI = False
+    if "--noisy" in sys.argv:
+        QUIET = False
+
     while True:
         whatnext = pomodoro_prompt_plan(whatdid)
 
-        start = datetime.now(pytz.utc)
+        start = datetime.now(utc)
         end = start + timedelta(minutes=WORK_MIN)
         log_step('Start with plan: ' + whatnext, start)
         try:
-            print('Working on: ' + whatnext)
+            print('Working on: ' + (whatnext or "(...it must be a mystery)"))
             countdown_to(end)
             if not QUIET:
-                from playsound import playsound
-                playsound('res/timesup.aac')
+                bing()
             whatdid = pomodoro_prompt_report(whatnext)
             record_task(whatnext, whatdid, start)
             log_step('Completed pomodoro: ' + whatdid, start, True)
@@ -129,16 +165,16 @@ def main():
             print('Break time!')
             # We're taking a break.  Clear out task start/end times.
             start = None
-            end = datetime.now(pytz.utc) + timedelta(minutes=SHORT_MIN)
+            end = datetime.now(utc) + timedelta(minutes=SHORT_MIN)
             countdown_to(end)
             if not QUIET:
-                playsound('res/timesup.aac')
+                bing()
             continue
         except KeyboardInterrupt:
             if start is None:
                 quit_prompt()
                 continue
-            time_spent = datetime.now(pytz.utc) - start
+            time_spent = datetime.now(utc) - start
             if time_spent < timedelta(minutes=INTERRUPTED_MIN):
                 quit_prompt()
                 continue
diff --git a/shell.nix b/shell.nix
index 484bf23..fff5e53 100644
--- a/shell.nix
+++ b/shell.nix
@@ -11,6 +11,7 @@ in pkgs.mkShell {
       pycairo
       pytz
       tzlocal
+      prompt-toolkit # for text entry history/auto complete
       # For Qt:
       # pyside6
       # Using GTK: