diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,4 +1,6 @@
-# Unreleased
+# 0.5.3.0
+
+* Prevent events with timestamps older than the current history head from getting added to the history.
 
 # 0.5.1.0
 
diff --git a/helic.cabal b/helic.cabal
--- a/helic.cabal
+++ b/helic.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           helic
-version:        0.5.2.0
+version:        0.5.3.0
 synopsis:       Clipboard Manager
 description:    See <https://hackage.haskell.org/package/helic/docs/Helic.html>
 category:       Clipboard
diff --git a/lib/Helic/Interpreter/History.hs b/lib/Helic/Interpreter/History.hs
--- a/lib/Helic/Interpreter/History.hs
+++ b/lib/Helic/Interpreter/History.hs
@@ -67,17 +67,18 @@
 sanitize e@Event {content} =
   e { content = sanitizeNewlines content }
 
--- |Append an event to the history unless the newest event contains the same text or there was an event within the last
--- second that contained the same text, to avoid clobbering due to cycles induced by external programs.
+-- |Append an event to the history unless the latest event contains the same text, or there was an event within the last
+-- second that contained the same text, or the new event has an earlier time stamp than the latest event, to avoid
+-- clobbering due to cycles induced by external programs.
 appendIfValid ::
   Chronos.Time ->
   Event ->
   Seq Event ->
   Maybe (Seq Event)
-appendIfValid now (sanitize -> e@Event {content}) = \case
+appendIfValid now (sanitize -> e@Event {content, time}) = \case
   Seq.Empty ->
     Just (Seq.singleton e)
-  _ :|> Event _ _ _ newest | newest == content ->
+  _ :|> Event _ _ latestTime latest | latest == content || time < latestTime ->
     Nothing
   hist | inRecent now e hist ->
     Nothing
@@ -143,7 +144,7 @@
   now <- Time.now
   atomicState' \ s -> do
     let rindex = length s - index - 1
-    case (s !? rindex) of
+    case s !? rindex of
       Just event ->
         (Seq.deleteAt rindex s |> event { time = now }, Just event)
       Nothing ->
diff --git a/test/Helic/Test/InsertEventTest.hs b/test/Helic/Test/InsertEventTest.hs
--- a/test/Helic/Test/InsertEventTest.hs
+++ b/test/Helic/Test/InsertEventTest.hs
@@ -7,7 +7,7 @@
 import Polysemy.Chronos (interpretTimeChronosConstant)
 import Polysemy.Test (UnitTest, assertJust, runTestAuto, (===))
 import qualified Polysemy.Time as Time
-import Polysemy.Time (Days (Days), MilliSeconds (MilliSeconds), convert, mkDatetime)
+import Polysemy.Time (Days (Days), Hours (Hours), MilliSeconds (MilliSeconds), convert, mkDatetime)
 import Torsor (add)
 
 import Helic.Data.Event (Event (Event))
@@ -47,3 +47,4 @@
     Nothing === appendIfValid (add (convert (MilliSeconds 100)) old) event2 historyLatest
     assertJust (historyLatest |> event2) (appendIfValid (add (convert (MilliSeconds 1100)) old) event2 historyLatest)
     assertJust (historyLatest |> eventNl) (appendIfValid now eventMixedNl historyLatest)
+    Nothing === appendIfValid now (Event "me" "test" (add (convert (Hours (-1))) old) "event3") historyLatest
diff --git a/test/Helic/Test/LoadTest.hs b/test/Helic/Test/LoadTest.hs
--- a/test/Helic/Test/LoadTest.hs
+++ b/test/Helic/Test/LoadTest.hs
@@ -37,4 +37,4 @@
     ev5 <- event 6
     assertJust ev5 =<< History.load 4
     assertEq Nothing =<< History.load 11
-    assertEq (show <$> ([1..5] ++ [7..10] ++ [6 :: Int])) =<< fmap Event.content <$> History.get
+    assertEq (show <$> ([1..5] ++ [7..10] ++ [6 :: Int])) . fmap Event.content =<< History.get
