anchor.diff:          )
   
       override this.ViewDidAppear animated = 
  -        if loaded = false then
  +        // inital load
  +        if loaded = false || (DateTime.UtcNow - lastEvent).TotalHours > 1.0 then
               this.WebView.LoadRequest(new NSUrlRequest(new NSUrl(Api.webUrl + "/api/chat/chatRoomTemplate")))
  -            this.WebView.LoadError.Add(fun error -> showSimpleAlert "Error" error.Error.Description "Close")
  -            this.WebView.LoadFinished.Add(fun _ ->
  -                this.WebView.Delegate <- webViewDelegate
  -                this.WebView.SetBodyBackgroundColor (colorToCss UIColor.White)
  -
  -                Async.startNetworkWithContinuation
  -                    (Chat.join room.Slug)
  -                    (function
  -                        | Api.ApiOk (result, events) ->
  -                            startSequence <- result.Sequence
  -                            loaded <- true
  -                            starred <- result.Channel.ViewerHasStarred
  -                            apps <- result.Channel.Apps
  -
  -                            if apps.Any(fun e -> appsAllowed.Contains(e)) then
  -                                gameController <- Some (new GameViewController(room, apps.First()))
  -
  -                            this.NavigationItem.RightBarButtonItems <- barButtons()
  -
  -                            result.Members |> Array.filter (fun e -> memberTypes.Contains e.Membership) |> Array.iter addUser
  -                            result.HistoricMembers |> Array.filter (fun e -> memberTypes.Contains e.Membership) |> Array.iter addUser
  -                            this.WebView.PreloadImages [ for user in users.Values do yield App.imageUrl user.Avatar nameplateImageSize ]
  -                            let lines = new List<string>()
  -                            for event in events do processEvent event (fun l _ -> lines.Add l)
  -                            addLines (lines.ToArray())
  -                            processor.Start()
  -
  -                            this.Progress.StopAnimating ()
  -
  -                        | error -> this.HandleApiFailure error 
  -                )
  -            )
  -
  -
  +           
  +        // mark things as read
           Async.startWithContinuation 
               (async {
                   do! DB.updateChatHistoryReadById room.Id
  
positive.code:         ()
  
  [<Register ("ChatRoomViewController")>]
  type ChatRoomViewController (room:Entity) as this =
      inherit UIViewController ("PrivateChatSessionViewController", null)
  
      let identity = match Api.userIdentity with | Some id -> id | None -> failwith "User must be logged in"
  
negative.code:                     ))
              )
      
          // keyboard
          showObserver <- UIKeyboard.Notifications.ObserveWillShow(System.EventHandler<UIKeyboardEventArgs>(placeKeyboard))
          hideObserver <- UIKeyboard.Notifications.ObserveWillHide(System.EventHandler<UIKeyboardEventArgs>(placeKeyboard))
          this.Text.BecomeFirstResponder () |> ignore
  